Функция crypt () объявлена ​​в unistd.h или crypt.h? - PullRequest
5 голосов
/ 25 мая 2011

Я использую GCC 4.6.0 ( на неопознанной платформе ).

Я использую функцию crypt() для шифрования пароля.

Я никогда не использовал эту функцию раньше, поэтому я проверил главную страницу:

man 3 crypt

И там написано, что нужно включить заголовок unistd.h.

Однако, когда я это сделал, я получилнеявное предупреждение для функции crypt.

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

Я провел небольшой поиск и обнаружил, что вы должны включить crypt.h.Однако почему это не говорит об этом на странице руководства?

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Стандарт POSIX для crypt() гласит, что он должен быть объявлен в <unistd.h>, поэтому это то, что вам нужно включить.

Однако, в зависимости от того, какие другие опции компилятора выукажите, вы можете или не можете видеть его.

В настоящее время я использую заголовок, который я называю "posixver.h", который содержит код:

#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 */

В системах, где я работаю, настройка _XOPEN_SOURCE до 700 было бы упражнением на разочарование и тщетность, однако я бы очень хотел это сделать.Но эти опции обычно заставляют мой код работать правильно на Linux, HP-UX, MacOS X, AIX и Solaris - Unix-подобных платформах, на которых я обычно работаю.

И это работает, когда я устанавливаю GCC в -std=c99Режим.Если вы используете -std=gnu99, вам, вероятно, вообще не нужен заголовок;он автоматически включает стандартные расширения C99 плюс.

Между прочим, я имел обыкновение иметь этот раздел в верхней части отдельных исходных файлов.По мере того, как количество файлов, содержащих раздел, росло (затрагивало сотни файлов), я осознал, что когда мне нужно было отрегулировать настройки, у меня была чудовищная работа по редактированию.Теперь у меня есть один заголовок, и я перестраиваю его в файлы, которые содержат раздел, поэтому я изменяю один файл (заголовок), чтобы произвести изменение для всего моего кода - как только я закончу устранять нанесенный мной ущерб.

3 голосов
/ 25 мая 2011

Там также написано #define _XOPEN_SOURCE (до включения unistd.h) в мою справочную страницу. Так что вы, вероятно, должны добавить его, чтобы выставить объявление crypt.

EDIT

Я только что попробовал. Включая unistd.h и #define _XOPEN_SOURCE, прежде чем он добьется цели. Включение одного этого недостаточно.

Использование

gcc version 4.6.0 20110429
GNU C Library stable release version 2.13

Просмотр 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));
...