C 即使在包含必需的标头之后,也会出现隐式声明错误
我在运行代码时遇到以下错误: 错误:函数“mkdtemp”的隐式声明[-Werror=隐式函数声明] 即使在包含正确的mkdtemp头文件后,也会发生这种情况:C 即使在包含必需的标头之后,也会出现隐式声明错误,c,function,declaration,implicit,C,Function,Declaration,Implicit,我在运行代码时遇到以下错误: 错误:函数“mkdtemp”的隐式声明[-Werror=隐式函数声明] 即使在包含正确的mkdtemp头文件后,也会发生这种情况: #include <stdlib.h> 你知道为什么会发生这种情况吗?标题是C标准规定的。C标准没有引用mkdtemp函数。如果您使用的是gcc-std=c11或类似的选项,那么只会公开C标准提供的定义。如果使用gcc-std=gnu11进行编译,那么将启用一组不确定的扩展特性,mkdtemp就是其中之一 因为它是一个PO
#include <stdlib.h>
你知道为什么会发生这种情况吗?标题是C标准规定的。C标准没有引用mkdtemp函数。如果您使用的是gcc-std=c11或类似的选项,那么只会公开C标准提供的定义。如果使用gcc-std=gnu11进行编译,那么将启用一组不确定的扩展特性,mkdtemp就是其中之一
因为它是一个POSIX函数,所以在包含任何标准头之前,可以通过定义适当的启用宏来显式请求它。例如,命令行选项-D_XOPEN_SOURCE=700可能会执行此任务;还可以选择使用-D_POSIX_C_SOURCE=200809,但记住正确的数字更难,因为POSIX 2008标准的日期是年和月
或者,您可以在文件顶部放置适当的“定义”:
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 700
#endif
或:
这些小节允许您在命令行上覆盖POSIX版本。简单地编写define而不附带条件将为宏的非良性重新定义生成警告或错误
POSIX和X/Open功能之间曾经有很大的区别——X/Open包含了一些POSIX没有的东西。现在这种区别越来越小,一般来说,使用X/Open宏不会有麻烦
其他平台还有其他启用宏,但其中一个将启用mkdtemp的声明。在Linux RHEL 7.x上,/usr/include/features.h记录了这些启用宏:
/*这些由用户或编译器定义
要指定所需的环境,请执行以下操作:
__严格的ANSI ISO标准C。
_从ISO C99到ISO C89的ISOC99_源扩展。
_从ISO C11到ISO C99的ISO 11_源扩展。
_POSIX_源IEEE标准1003.1。
_POSIX_C_SOURCE If==1,类似于_POSIX_SOURCE;如果>=2,则添加IEEE标准1003.2;
如果>=199309L,则添加IEEE标准1003.1b-1993;
如果>=199506L,则添加IEEE标准1003.1c-1995;
如果>=200112L,则所有IEEE 1003.1-2004
如果>=200809L,则所有IEEE 1003.1-2008
_XOPEN_源代码包括POSIX和XPG。如果需要,设置为500
需要单个Unix一致性,对于
第六次修订,第七次修订为700。
_XOPEN\u SOURCE\u扩展的XPG东西和X/openunix扩展。
_大文件\为正确的标准I/O提供更多函数。
_LARGEFILE64\从LFS为大文件提供附加功能。
_FILE\u OFFSET\u BITS=N选择默认文件系统接口。
_BSD_源代码ISO C、POSIX和4.3BSD。
_SVID_源代码isoc、POSIX和SVID东西。
_ATFILE_源附加*at接口。
_GNU_源所有上述内容,加上GNU扩展。
_可重入选择另外可重入的对象。
_线程安全与可重入相同,通常由其他系统使用。
_如果设置为数值>0,则加强\u源附加安全性
根据级别定义度量。
还请注意,mkdtemp的手册页面显示了所需的内容:
名称
mkdtemp-创建唯一的临时目录
提要
包括
char*mkdtempchar*模板;
glibc的功能测试宏要求见功能测试宏7:
mkdtemp:
_BSD_源
||/*自glibc 2.10以来:*/
_POSIX|C|U源>=200809L||U XOPEN|U源>=700
我所谓的“启用宏”也称为“功能测试”宏
另请参见POSIX。应该可以。确保将此include放在给定编译单元的正确位置。您使用的是什么操作系统、编译器和libc?请提供一个刚刚修复了错误的示例,方法是尝试定义_POSIX_C_SOURCE 200809L。谢谢你的回复!
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200809L
#endif