为什么gcc可以编译以下代码
#include <stdio.h>
int func();
int func(int a) { return 1; }
int main() {
func(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我补充一下char func();,gcc说conflicting types for ‘func’
das*_*ght 11
这不是重载,因为你不能func()在没有参数的情况下调用.这是具有兼容函数声明符的单个函数的特例,如标准中所述:
如果一个类型具有参数类型列表而另一个类型由函数声明符指定,该函数声明符不是函数定义的一部分并且包含空标识符列表,则参数列表不应具有省略号终止符,并且每个参数的类型应为与应用默认参数促销产生的类型兼容.
从更改返回类型int来char就是要打破这个规则的一种方式.打破它的另一种方法是提供除以下参数之外的参数类型int:
int func();
int func(char a) { return 1; } // Does not compile
Run Code Online (Sandbox Code Playgroud)
如果您想声明一个不带任何参数的函数,声明符应如下所示:
int func(void);
Run Code Online (Sandbox Code Playgroud)
现在声明func,它接受一个int会导致编译时错误:
int func(void);
int func(int a) { return 1; } // Does not compile
Run Code Online (Sandbox Code Playgroud)