即使包含必需的标头,隐式声明错误

问题描述

运行代码时出现以下错误错误函数“ mkdtemp”的隐式声明[-Werror = implicit-function-declaration]

即使为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,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 System Interfaces: General Information: The Compilation Environment