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

时间:2015-07-09 18:26:13

标签: c function

我很惊讶地发现这是C中的有效函数声明:

f() {
    return 10; 
}

未指定函数的返回类型。它不仅编译,而且实际上返回10。

void main() {
        int i = f();
        printf("i = %d\n", i); 
}

此代码产生以下输出:

i = 10

这是用gcc 4.8.4编译的。 为什么没有明确指定的返回类型的函数声明编译而没有错误/警告?

编辑:正如here所解释的那样,返回类型不是函数签名的一部分,你不能根据不同的返回类型重载函数,但是没有回答问题的是返回函数声明所需的类型。

4 个答案:

答案 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)

fmain的函数声明都不符合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或者它将给出错误取决于......