Функция crypt() объявлена в unistd.h или crypt.h?
Я использую GCC 4.6.0 (на неопознанной платформе).
Я использую crypt()
функция для шифрования пароля.
Я никогда не использовал эту функцию раньше, поэтому я проверил главную страницу:
man 3 crypt
И это говорит, чтобы включить unistd.h
заголовок.
Однако, когда я сделал это, я получил неявное предупреждение для crypt
функция.
warning: implicit declaration of function ‘crypt’ [-Wimplicit-function-declaration]
Я немного искал и обнаружил, что вы должны включить crypt.h
, Однако, почему это не говорит об этом на странице руководства?
2 ответа
Это также говорит #define _XOPEN_SOURCE
(перед включением unistd.h
) в моей справочной странице. Таким образом, вы должны, вероятно, добавить его, чтобы выставить декларацию crypt
,
РЕДАКТИРОВАТЬ
Я только что попробовал это. В том числе 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));
Стандарт 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 плюс.
Между прочим, у меня был этот раздел в верхней части отдельных исходных файлов. По мере того, как количество файлов, содержащих раздел, росло (затрагивало сотни файлов), я понял, что когда мне нужно было отрегулировать настройки, у меня была чудовищная работа по редактированию. Теперь у меня есть один заголовок, и я перестраиваю его в файлы, которые содержат раздел, поэтому я изменяю один файл (заголовок), чтобы произвести изменение для всего моего кода - как только я закончу устранять нанесенный мной ущерб.