2011-05-25 12 views
5

estoy usando GCC 4.6.0 (en una plataforma de otra forma no identificada).¿La función crypt() está declarada en unistd.h o crypt.h?

estoy usando la función crypt() para cifrar una contraseña.

nunca he utilizado esa función antes, así que nos marchamos a la página principal:

man 3 crypt 

y dice que incluya la cabecera unistd.h.

Sin embargo, cuando hice eso, tengo una advertencia implícita para la función crypt.

warning: implicit declaration of function ‘crypt’ [-Wimplicit-function-declaration] 

Hice un poco de búsqueda y me encontré con que tiene que incluir la crypt.h. Sin embargo, ¿cómo es que no dice eso en la página del manual?

+0

Mi nombre no es 'gcc 4.6.0'. –

+0

Publique la advertencia exacta que está recibiendo en tiempo de compilación. –

+0

@Michael, he adjuntado mi pregunta con la advertencia que recibo. – ant2009

Respuesta

3

También dice #define _XOPEN_SOURCE (antes de incluir unistd.h) en mi página man. Entonces probablemente debería agregarlo para exponer la declaración de crypt.

EDITAR

yo sólo lo intentaron. Incluyendo unistd.hy#define _XOPEN_SOURCE antes de que haga el truco. Incluirlo solo no es suficiente.

Usando

gcc version 4.6.0 20110429 
GNU C Library stable release version 2.13 

Mirando hacia unistd.h:

/* XPG4.2 specifies that prototypes for the encryption functions must 
    be defined here. */ 
#ifdef __USE_XOPEN 
/* Encrypt at most 8 characters from KEY using salt to perturb DES. */ 
extern char *crypt (__const char *__key, __const char *__salt) 
    __THROW __nonnull ((1, 2)); 
+0

Agregué _XOPEN_SOURCE. Sin embargo, todavía recibía la advertencia con eso. – ant2009

+1

No solo lo define, sino que le da un valor. El valor debe ser 700 para el último estándar. –

+0

@R .. Eso suena sensato, pero la página man dice '#define _XOPEN_SOURCE'. No lo he intentado sin embargo. – cnicutar

3

El estándar POSIX para crypt() dice que debería ser declarado en <unistd.h>, así que eso es lo que hay que incluir.

Sin embargo, dependiendo de qué otras opciones de compilador que especifique, puede o no puede verlo.

Actualmente utilizo una cabecera que llamo "posixver.h" que contiene el código:

#ifndef JLSS_ID_POSIXVER_H 
#define JLSS_ID_POSIXVER_H 

/* 
** Include this file before including system headers. By default, with 
** C99 support from the compiler, it requests POSIX 2001 support. With 
** C89 support only, it requests POSIX 1997 support. Override the 
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE. 
*/ 

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */ 
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */ 
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */ 

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE) 
#if __STDC_VERSION__ >= 199901L 
#define _XOPEN_SOURCE 600 /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */ 
#else 
#define _XOPEN_SOURCE 500 /* SUS v2, POSIX 1003.1 1997 */ 
#endif /* __STDC_VERSION__ */ 
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */ 

#endif /* JLSS_ID_POSIXVER_H */ 

En los sistemas en los que trabajo, el establecimiento de _XOPEN_SOURCE-700 sería un ejercicio de frustración e inutilidad, por mucho que me gustaría poder hacerlo Pero estas opciones normalmente hacen que mi código funcione correctamente en Linux, HP-UX, MacOS X, AIX y Solaris, las plataformas tipo Unix en las que normalmente trabajo.

Y esto funciona cuando me puse GCC en -std=c99 modo. Si usa -std=gnu99, probablemente no necesite el encabezado; automáticamente habilita las extensiones estándar C99 plus.

Por cierto, yo solía tener esta estrofa en la parte superior de los archivos fuente individuales. A medida que crecía el número de archivos que contenían la estrofa (invadiendo cientos de archivos), me di cuenta de que cuando tenía que ajustar la configuración, tenía un trabajo de edición monstruoso por delante. Ahora tengo un encabezado y lo estoy adaptando a los archivos que tienen la estrofa, así que cambio un archivo (el encabezado) para efectuar un cambio para todo mi código, una vez que termine de deshacer el daño que hice.

Cuestiones relacionadas