为什么允许声明一个C函数没有指定返回类型?

ege*_*lev 0 c function

我很惊讶地发现这是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编译的.为什么没有明确指定的返回类型的函数声明编译而没有错误/警告?

编辑:作为解释这里的返回类型不是函数签名的一部分,你不能超载根据不同的返回类型的功能,但问题是,需要返回类型函数声明不回答.

acw*_*ers 7

在ANSI C(C89/90)中,隐式指定未指定的返回类型int.自C99以来,这已被正式禁止,但这并不能阻止编译器实现它.如果在C99或C11模式下编译,GCC -pedantic或类似的标志应该发出警告.

编辑:在GCC 4.9中,-Wall默认(GNU C)模式-pedantic警告它,并警告它-std=c99.