GCC报错‘非静态声明跟随静态声明’:auto函数声明为何是静态?
GCC函数声明报错原因解析
先看你提供的代码:
int main (void) { auto int func (int a); int func (int a); // <-- 问题行 }
编译时GCC抛出的错误:
error: non-static declaration of ‘func’ follows static declaration
报错原因拆解
auto修饰函数的特殊处理:C语言标准里,auto存储类仅适用于局部变量,不能用来修饰函数。但GCC对这种不符合标准的写法做了兼容映射——当在函数内部(比如main函数里)用auto声明另一个函数时,会把这个声明默认解析为static(即该函数仅当前文件可见,内部链接)。- 链接属性冲突:问题行的
int func(int a);是无存储类的函数声明,C语言默认这类声明为extern(外部链接,可跨文件访问)。同一个作用域内,函数的链接属性必须一致,前面被解析为static的声明和后面默认extern的声明冲突,因此编译器报错。
内容的提问来源于stack exchange,提问作者Edenia
相关产品推荐
相关产品推荐

