crypt()函数是在unistd.h或crypt.h中声明的吗?

时间:2011-05-25 16:43:59

标签: c crypt

我正在使用GCC 4.6.0(在另外一个未经识别的平台上)。

我正在使用crypt()函数来加密密码。

之前我从未使用过该功能所以我查看了主页:

man 3 crypt

它说要包含unistd.h标题。

然而,当我这样做时,我收到crypt函数的隐含警告。

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

我做了一些搜索,发现你必须包含crypt.h。但是,为什么在man页面中没有说呢?

2 个答案:

答案 0 :(得分:3)

它还在我的手册页中说#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));

答案 1 :(得分:3)

crypt()的POSIX标准说它应该在<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标准和扩展。

顺便说一句,我曾经把这个节放在各个源文件的顶部。随着包含该节的文件数量的增加(侵占数百个文件),我意识到当我需要调整设置时,我面前有一个可怕的编辑工作。现在我有一个标题,我正在将它改装成具有该节的文件,所以我更改了一个文件(标题)以对我的所有代码进行更改 - 一旦我完成撤消我所做的损坏。