为什么,如果c ++标准说语法不正确,g ++是否允许它?

时间:2011-03-28 20:00:00

标签: c++ standards

我刚读了一条评论,上面写着:

“你永远不应该使用void main(),你应该始终使用int main()。”

现在我知道使用int main()的原因(这样你可以检查返回成功等等)但我不知道使用void main()是非法的。我做了一些调查,我发现不使用void main()的唯一原因是因为“标准这样说”。

我的问题是: 为什么,如果C ++标准说main必须返回一个值,g ++是否允许程序员使用void main()作为有效语法?它不应该返回错误/警告,因为它违反了标准所说的内容吗?

4 个答案:

答案 0 :(得分:2)

这仅表示编译器的特定版本可能允许它,但更高版本(可能更符合标准)可能不允许它。所以最好从头开始编写标准符合代码!

答案 1 :(得分:1)

根据标准,main确实需要返回int。但是许多编译器允许返回类型的void,因为在预标准的C ++中它是允许的,并且很长一段时间内很多代码都是用返回类型的void编写的。

值得一提的是,C ++明确允许对void:

的return语句的删除
int main() {
}

将返回0.但只允许使用main。

答案 2 :(得分:1)

GNU项目有decent summary of their philosophy

  

在大多数情况下,遵循已发布的标准对用户来说很方便 - 这意味着他们的程序或脚本可以更方便地工作。 ...

     

但是我们并没有严格遵循这些规范中的任何一个,并且我们决定不遵循它们的具体要点,以便为用户提供更好的GNU系统。

     

例如,标准C表示几乎所有对C的扩展都是禁止的。真傻! GCC实现了许多扩展,其中一些后来被作为标准的一部分采用。如果您希望这些构造在标准中给出“必需”的错误消息,则必须指定--pedantic,这只是为了我们可以说“GCC是标准的100%实现”而不是因为有任何理由实际使用它。

     

POSIX.2指定dfdu默认情况下必须以512字节为单位输出大小。用户想要的是1k的单位,这是我们默认做的。如果您想要POSIX“必需”的荒谬行为,则必须设置环境变量POSIXLY_CORRECT(最初将命名为POSIX_ME_HARDER)。 ...

     

特别是,不要拒绝新功能或删除旧功能,仅仅因为标准说它被“禁止”或“弃用”。

有时候,海湾合作委员会已经删除了扩展,因为它们引起了像这样的混乱。我相信这个扩展存在允许编译错误main声明的旧代码,而不一定鼓励人们编写void main()。类似于允许pre-POSIX函数声明的扩展。此外,虽然int main(int argc, const char** argv)是C批准的main声明,但C ++标准还会制裁int main()和POSIX制裁int main(int argc, const char** argv, const char** envp)。可能还有其他我尚未遇到过的声明。

答案 3 :(得分:1)

您可以使用以下构建命令强制编译器成为标准补充:

-ansi -pedantic -Wall

如果您不编码跨平台代码,那么-c99可能是更好的选择。并非所有编译器都支持这一点。