2011-05-25 84 views
5

我正在使用GCC 4.6.0(在其他未识别的平台上)。crypt()函数是在unistd.h还是crypt.h中声明的?

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

man 3 crypt 

而且它说,包括unistd.h头:

之前,所以我检查了主网页我从来没有使用该功能。

但是,当我这样做时,我得到了crypt函数的隐式警告。

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

我做了一些搜索,我发现你必须包括crypt.h。然而,它怎么没有说在手册页?

+0

我的名字不是'gcc 4.6.0'。 – 2011-05-25 16:47:15

+0

请在编译时发布准确的警告。 – 2011-05-25 16:47:25

+0

@迈克尔,我已经附加了我的问题与我得到的警告。 – ant2009 2011-05-25 16:54:22

回答

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)); 
+0

我确实添加了_XOPEN_SOURCE。但是,我仍然收到警告。 – ant2009 2011-05-25 16:54:55

+1

你不只是定义它,而是给它一个价值。最新标准的值应为700。 – 2011-05-25 17:30:08

+0

@R ..这听起来很明智,但手册页上说'#define _XOPEN_SOURCE'。我还没有尝试过。 – cnicutar 2011-05-25 17:34:26

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标准加扩展。

顺便说一下,我曾经在单个源文件的顶部有这个节。随着含有节的文件数量增加(侵入数百个文件),我意识到,当我需要调整设置时,我在我面前进行了一个巨大的编辑工作。现在我有了一个头文件,并且将它翻译成包含文本的文件,因此我更改了一个文件(头文件),以便对我的所有代码进行更改 - 一旦完成了撤消损坏的操作。

相关问题