为什么定义main()没有返回类型编译没有错误?

时间:2015-06-05 23:30:32

标签: c++ gcc

我只是通过使用GCC(g++);

进行编译来测试此代码
#include <stdio.h>

main(int argc, char **argv){

    printf("something");

}

似乎建立并运行正常,只是警告说;

ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]

虽然我将main()定义为没有返回类型且没有返回任何值 然后我决定通过使用Visual C ++编译器编译它来测试相同的代码,但它有效地抛出了错误:

missing type specifier - int assumed. Note: C++ does not support default-int

并且构建不成功。

我期待GCC抛出错误并停止编译而不是警告并让它成功构建。

为什么GCC给予main()这样的特权,不让它知道它的返回类型?

2 个答案:

答案 0 :(得分:5)

该计划格式不正确。 C ++标准不允许省略返回类型。

编译器没有将其视为致命错误的原因是历史性的。在1999年标准之前,C确实允许省略函数的返回类型;它将默认为int。 C ++派生自C,因此C ++的早期(预标准版)具有相同的规则。

在现代C ++中,省略返回类型是一个错误。编译器需要诊断这样的错误,但不要求它将其视为致命错误。通过打印警告,编译器就标准而言已经完成了它的工作。

不要忽视警告。

答案 1 :(得分:1)

这是因为您正在使用实现某些非标准语言扩展的编译器。其中一个是函数声明的旧式C语言“隐式int”规则。因此,从特定编译器的角度来看,函数声明意味着int返回类型。

还应该说,从C ++语言的角度来看,编译器不需要拒绝编译无效代码或发出“错误”。只需要发出诊断消息,任何诊断消息。您看到的警告已经是一条诊断消息。编译器给你一个警告,上面写着“ISO C ++禁止......” - 这已经足以说明你的代码被破坏了。在那之后,你的代码是否“编译没有错误”完全无关紧要。

无论如何,如果您将编译器配置为禁用非标准扩展(请参阅-pedantic-errors flag和-std标志),编译器肯定会拒绝编译您的代码。