代码之家  ›  专栏  ›  技术社区  ›  Chan Kim

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

  •  -1
  • Chan Kim  · 技术社区  · 6 年前

    我有一个程序,我通过修改许多地方从原来的暗网(深入学习图像识别,约洛夫2)。几个月前我一直在使用它,但今天当我编译它时,它给了我一个下面的错误:

    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来检查目录是否存在,如果不存在,则创建目录。此错误出现在stat.h文件的include行和内部。我查了一下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 回复  |  直到 6 年前
        1
  •  0
  •   Jonathan Leffler vy32    6 年前

    通常,系统头必须包含在代码中的任何函数之外。C11标准规定 §7.1.2 Standard headers (增加了重点):

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

    我在POSIX中没有找到等价的措辞,但是您应该假设类似的规则适用。

    考虑到提到“嵌套函数”的错误消息,您可能正在尝试包括 #include <sys/stat.h> 从某个函数的范围内,考虑到头部定义了一些内联函数,您不小心试图将这些函数定义为嵌套函数,这在一般情况下是不允许的(尽管gcc对嵌套函数有一些支持,但您可能会将其视为不可移植的)。