c-隐式声明错误,即使在包含必需的标头之后也是如此



运行代码时出现以下错误:错误:函数"mkdtemp"的隐式声明[-Weror=隐式函数声明]

即使在包含mkdtemp((的正确头文件之后,也会发生这种情况:

#include <stdlib.h>

你知道为什么会发生这种情况吗?

<stdlib.h>标头是由C标准强制要求的。C标准没有引用mkdtemp()函数。如果您使用的是gcc -std=c11或类似的选项,则只显示C标准提供的定义。如果使用gcc -std=gnu11进行编译,那么将启用一组不确定的扩展功能(mkdtemp()就是其中之一(。

由于mkdtemp()是一个POSIX函数,您可以通过在包含任何标准标头之前定义适当的启用宏来明确请求它。例如,命令行选项-D_XOPEN_SOURCE=700(可能(会完成这项工作;也可以选择使用-D_POSIX_C_SOURCE=200809,但记住正确的数字更难(它是POSIX 2008标准的日期,作为年和月(。

或者,您可以将适当的#define放在文件的顶部:

#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 700
#endif

或:

#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200809L
#endif

这些节允许您在命令行上重写POSIX版本。简单地编写#define而不附带条件会为宏的非良性重新定义生成警告(或错误(。

POSIX和X/Open功能曾经有很大的区别——X/Open包含了一些POSIX没有的东西。现在这种区别越来越小,而且通常情况下,使用X/Open宏不会遇到麻烦。

其他平台还有其他启用宏,但其中一个将启用mkdtemp()的声明。在Linux(RHEL 7.x(上,/usr/include/features.h(记录了这些启用宏:

/* These are defined by the user (or the compiler)
to specify the desired environment:
__STRICT_ANSI__      ISO Standard C.
_ISOC99_SOURCE       Extensions to ISO C89 from ISO C99.
_ISOC11_SOURCE       Extensions to ISO C99 from ISO C11.
_POSIX_SOURCE        IEEE Std 1003.1.
_POSIX_C_SOURCE      If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993;
if >=199506L, add IEEE Std 1003.1c-1995;
if >=200112L, all of IEEE 1003.1-2004
if >=200809L, all of IEEE 1003.1-2008
_XOPEN_SOURCE        Includes POSIX and XPG things.  Set to 500 if
Single Unix conformance is wanted, to 600 for the
sixth revision, to 700 for the seventh revision.
_XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
_LARGEFILE_SOURCE    Some more functions for correct standard I/O.
_LARGEFILE64_SOURCE  Additional functionality from LFS for large files.
_FILE_OFFSET_BITS=N  Select default filesystem interface.
_BSD_SOURCE          ISO C, POSIX, and 4.3BSD things.
_SVID_SOURCE         ISO C, POSIX, and SVID things.
_ATFILE_SOURCE       Additional *at interfaces.
_GNU_SOURCE          All of the above, plus GNU extensions.
_REENTRANT           Select additionally reentrant object.
_THREAD_SAFE         Same as _REENTRANT, often used by other systems.
_FORTIFY_SOURCE      If set to numeric value > 0 additional security
measures are defined, according to level.

同样需要注意的是,mkdtemp()的手册页面显示了需要什么:

NAME
mkdtemp - create a unique temporary directory
SYNOPSIS
#include <stdlib.h>
char *mkdtemp(char *template);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
mkdtemp():
_BSD_SOURCE
|| /* Since glibc 2.10: */
(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)

我所说的"启用宏"也称为"功能测试"宏。

另请参阅POSIX系统接口:一般信息:编译环境。

相关内容

  • 没有找到相关文章

最新更新