我很惊讶地发现这是C中的有效函数声明:
f() {
return 10;
}
未指定函数的返回类型。它不仅编译,而且实际上返回10。
void main() {
int i = f();
printf("i = %d\n", i);
}
此代码产生以下输出:
i = 10
这是用gcc 4.8.4编译的。 为什么没有明确指定的返回类型的函数声明编译而没有错误/警告?
编辑:正如here所解释的那样,返回类型不是函数签名的一部分,你不能根据不同的返回类型重载函数,但是没有回答问题的是返回函数声明所需的类型。
答案 0 :(得分:7)
在ANSI C(C89 / 90)中,未指定的返回类型是隐式int
。自C99以来,这已被正式禁止,但这并不能阻止编译器实现它。如果在C99或C11模式下进行编译,GCC的-pedantic
或类似的标志应该发出警告。
编辑:在GCC 4.9中,-Wall
在默认(GNU C)模式下警告它,-pedantic
用-std=c99
警告它。
答案 1 :(得分:1)
它不是 modern C中的有效函数声明(它是在该语言的“经典”C89 / 90版本中)。编译器接受它的事实并不意味着它是有效的。它只是意味着您的编译器未配置为严格执行标准C语言的现代要求。
后者也很明显,它允许您使用main
返回类型声明void
。
如果要使用GCC来验证代码的形式有效性,则需要在命令行中指定-std=...
和-pedantic-errors
个开关。它不会让它万无一失,但它会使它更加合规。
P.S。默认情况下,GCC甚至可以在C ++代码中执行此操作。它在C ++中从来就不合法。
答案 2 :(得分:0)
f
和main
的函数声明都不符合C标准。现代C编译器应发出诊断消息。
早些时候,在采用C99标准之前,如果未指定函数返回类型,则假定它是int
。
某些编译器(例如MS VC ++)允许将函数main声明为具有返回类型void
;但是,根据C标准(和C ++标准),函数main应具有返回类型int
。
在C函数中,main应声明为(如果它没有参数)
int main( void )
答案 3 :(得分:0)
根据ANSI C,每个函数都有一个默认的返回类型为整数。这就是为什么它没有给出错误(没有指定返回)的原因。
int f() {
printf("hmm\n");
}
f() {
return 10.1;
}
输出将为10或者它将给出错误取决于......