La fonction crypt () est-elle déclarée dans unistd.h ou crypt.h?

J’utilise GCC 4.6.0 ( sur une plate-forme par ailleurs non identifiée ).

J’utilise la fonction crypt() pour chiffrer un mot de passe.

Je n’ai jamais utilisé cette fonction auparavant, alors j’ai vérifié la page principale:

 man 3 crypt 

Et il est dit d’inclure l’en-tête unistd.h .

Cependant, lorsque j’ai fait cela, j’ai reçu un avertissement implicite pour la fonction crypt .

 warning: implicit declaration of function 'crypt' [-Wimplicit-function-declaration] 

J’ai fait un peu de recherche et j’ai trouvé qu’il crypt.h inclure le crypt.h . Cependant, comment se fait-il que cela ne soit pas indiqué dans la page de manuel?

Il indique également #define _XOPEN_SOURCE (avant d’inclure unistd.h ) dans ma page de manuel. Donc, vous devriez probablement l’append pour exposer la déclaration de crypt .

MODIFIER

Je viens d’essayer. Y compris unistd.h et #define _XOPEN_SOURCE avant que le #define _XOPEN_SOURCE ne soit #define _XOPEN_SOURCE . L’inclure seul ne suffit pas.

En utilisant

 gcc version 4.6.0 20110429 GNU C Library stable release version 2.13 

En regardant dans 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)); 

Le standard POSIX pour crypt() indique qu’il doit être déclaré dans , c’est donc ce que vous devez inclure.

Cependant, en fonction des autres options du compilateur que vous spécifiez, vous pouvez les voir ou non.

J’utilise actuellement un en-tête appelé "posixver.h" qui contient le code:

 #ifndef JLSS_ID_POSIXVER_H #define JLSS_ID_POSIXVER_H /* ** Include this file before including system headers. By default, with ** C99 support from the comstackr, 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 */ 

Sur les systèmes où je travaille, définir _XOPEN_SOURCE sur 700 constituerait un exercice frustrant et futile, même si j’aimerais beaucoup pouvoir le faire. Mais ces options permettent normalement à mon code de fonctionner correctement sous Linux, HP-UX, MacOS X, AIX et Solaris, plates-formes de type Unix sur lesquelles je travaille normalement.

Et cela fonctionne lorsque je règle GCC en mode -std=c99 . Si vous utilisez -std=gnu99 , vous n’avez probablement pas besoin de l’en-tête du tout; il active automatiquement les extensions standard C99 plus.

Incidemment, j’avais l’habitude d’avoir cette strophe au sumt des fichiers source individuels. Alors que le nombre de fichiers contenant la strophe augmentait (empiétant sur des centaines de fichiers), je me suis rendu compte que lorsque je devais ajuster les parameters, j’avais un travail d’édition monstrueux devant moi. Maintenant, j’ai un en-tête et je le rajoute dans les fichiers qui ont la strophe. Je change donc un fichier (l’en-tête) pour modifier tout mon code – une fois que j’ai fini de réparer les dommages que j’ai causés.