C 即使在包含必需的标头之后,也会出现隐式声明错误

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

我在运行代码时遇到以下错误: 错误:函数“mkdtemp”的隐式声明[-Werror=隐式函数声明]

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

#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