我很惊讶地发现这是C中的有效函数声明:
f() {
return 10;
}
Run Code Online (Sandbox Code Playgroud)
未指定函数的返回类型.它不仅编译,而且实际上返回10.
void main() {
int i = f();
printf("i = %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
此代码导致以下输出:
i = 10
Run Code Online (Sandbox Code Playgroud)
这是用gcc 4.8.4编译的.为什么没有明确指定的返回类型的函数声明编译而没有错误/警告?
编辑:作为解释这里的返回类型不是函数签名的一部分,你不能超载根据不同的返回类型的功能,但问题是,需要返回类型函数声明不回答.
在ANSI C(C89/90)中,隐式指定未指定的返回类型int.自C99以来,这已被正式禁止,但这并不能阻止编译器实现它.如果在C99或C11模式下编译,GCC -pedantic或类似的标志应该发出警告.
编辑:在GCC 4.9中,-Wall默认(GNU C)模式-pedantic警告它,并警告它-std=c99.