我只是通过使用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()
这样的特权,不让它知道它的返回类型?
答案 0 :(得分:5)
该计划格式不正确。 C ++标准不允许省略返回类型。
编译器没有将其视为致命错误的原因是历史性的。在1999年标准之前,C确实允许省略函数的返回类型;它将默认为int
。 C ++派生自C,因此C ++的早期(预标准版)具有相同的规则。
在现代C ++中,省略返回类型是一个错误。编译器需要诊断这样的错误,但不要求它将其视为致命错误。通过打印警告,编译器就标准而言已经完成了它的工作。
不要忽视警告。
答案 1 :(得分:1)
这是因为您正在使用实现某些非标准语言扩展的编译器。其中一个是函数声明的旧式C语言“隐式int
”规则。因此,从特定编译器的角度来看,函数声明意味着int
返回类型。
还应该说,从C ++语言的角度来看,编译器不需要拒绝编译无效代码或发出“错误”。只需要发出诊断消息,任何诊断消息。您看到的警告已经是一条诊断消息。编译器给你一个警告,上面写着“ISO C ++禁止......” - 这已经足以说明你的代码被破坏了。在那之后,你的代码是否“编译没有错误”完全无关紧要。
无论如何,如果您将编译器配置为禁用非标准扩展(请参阅-pedantic-errors
flag和-std
标志),编译器肯定会拒绝编译您的代码。