sys / stat.h:456:错误:嵌套函数“ stat”声明为“ extern”

时间:2019-01-18 07:54:30

标签: c gcc nested extern

我有一个程序,是通过从原始的Darknet(深度学习图像识别,Yolov2)中修改许多地方而制作的。直到几个月前我一直在使用它,但是今天当我编译它时,它在下面给了我一个错误:

gcc  -DSAVE_LAYER_INPUTS -DSAVE_INPUTS_LAYER_START=31 -DSAVE_INPUTS_LAYER_END=31 -DPRINT_INOUT -Wall -Wfatal-errors  -O3 -ffast-math -c ./src/convolutional_layer.c -o obj/convolutional_layer.o
In file included from ./src/convolutional_layer.c:463:
/usr/include/sys/stat.h: In function 'forward_convolutional_layer':
/usr/include/sys/stat.h:456: error: nested function 'stat' declared 'extern'

我使用stat.h检查目录是否存在,如果不存在,则进行创建。该错误出现在#include行和stat.h文件中。我调查了stat.h,但无法判断出什么问题。 stat.h看起来像这样(我显示了其中一个是456行。)

#if defined __GNUC__ && __GNUC__ >= 2 && defined __USE_EXTERN_INLINES
/* Inlined versions of the real stat and mknod functions.  */

__extern_inline int
__NTH (stat (__const char *__path, struct stat *__statbuf))
{     // <=== line 456
  return __xstat (_STAT_VER, __path, __statbuf);
}

__ NTH只是添加了关于throw的属性。问题是什么? (在CentOS 6.9上使用gcc 4.4.7)

1 个答案:

答案 0 :(得分:0)

通常,系统头文件必须包含在代码中任何函数的外部。 C11标准说§7.1.2 Standard headers(强调):

  

¶4标准标头可以以任何顺序包括在内;在给定范围内,每个元素都可以被多次包含,除了包含<assert.h>的效果取决于NDEBUG的定义(参见§7.2)外,其他效果与仅包含一次相同。 如果使用了标头,则应将其包含在任何外部声明或定义之外,,并且应首先在对它声明的任何函数或对象,任何类型或类型的第一次引用之前包含标头。它定义的宏。但是,如果在一个以上的标头中声明或定义了一个标识符,则可以在对标识符的初始引用之后包含第二个和后续关联的标头。该程序不得包含名称与在包含头文件之前或扩展头文件中定义的任何宏时当前定义的关键字在词法上相同的宏。

我在POSIX中找不到等效的措词,但是您应该假设适用类似的规则。

鉴于错误消息中提到“嵌套函数”,您很可能试图在其中一个函数的作用域内包含#include <sys/stat.h>,并且鉴于标头定义了一些内联函数,意外地尝试将它们定义为嵌套函数,这通常是不允许的(尽管GCC对嵌套函数有一定支持,但您可能应该将其视为不可移植)。