即使在包含必需的 header 之后仍存在隐式声明错误
implicit declaration error even after including required header
当我 运行 我的代码时出现以下错误:
错误:函数‘mkdtemp’的隐式声明[-Werror=implicit-function-declaration]
即使在为 mkdtemp() 包含正确的 header 文件后也会发生这种情况:
#include <stdlib.h>
知道为什么会发生这种情况吗?
<stdlib.h>
header 是 C 标准强制要求的。 C 标准没有引用 mkdtemp()
函数。如果您使用 gcc -std=c11
或一些类似的选项,则只会公开 C 标准提供的定义。如果您使用 gcc -std=gnu11
进行编译,那么您将启用一组不确定的扩展功能(mkdtemp()
将是其中之一)。
由于 mkdtemp()
是一个 POSIX 函数,您可以在包含任何标准 header 之前通过定义适当的启用宏来明确请求它。例如,command-line 选项 -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
而没有围绕它的条件会为宏的 non-benign 重新定义生成警告(或错误)。
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)
我所谓的'enabling macros'也被称为'Feature Test'宏。
另见 POSIX System Interfaces: General Information: The Compilation Environment。
当我 运行 我的代码时出现以下错误: 错误:函数‘mkdtemp’的隐式声明[-Werror=implicit-function-declaration]
即使在为 mkdtemp() 包含正确的 header 文件后也会发生这种情况:
#include <stdlib.h>
知道为什么会发生这种情况吗?
<stdlib.h>
header 是 C 标准强制要求的。 C 标准没有引用 mkdtemp()
函数。如果您使用 gcc -std=c11
或一些类似的选项,则只会公开 C 标准提供的定义。如果您使用 gcc -std=gnu11
进行编译,那么您将启用一组不确定的扩展功能(mkdtemp()
将是其中之一)。
由于 mkdtemp()
是一个 POSIX 函数,您可以在包含任何标准 header 之前通过定义适当的启用宏来明确请求它。例如,command-line 选项 -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
而没有围绕它的条件会为宏的 non-benign 重新定义生成警告(或错误)。
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)
我所谓的'enabling macros'也被称为'Feature Test'宏。
另见 POSIX System Interfaces: General Information: The Compilation Environment。