我刚读了一条评论,上面写着:
“你永远不应该使用void main()
,你应该始终使用int main()
。”
现在我知道使用int main()
的原因(这样你可以检查返回成功等等)但我不知道使用void main()
是非法的。我做了一些调查,我发现不使用void main()
的唯一原因是因为“标准这样说”。
我的问题是:
为什么,如果C ++标准说main必须返回一个值,g ++是否允许程序员使用void main()
作为有效语法?它不应该返回错误/警告,因为它违反了标准所说的内容吗?
答案 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指定
df
和du
默认情况下必须以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
可能是更好的选择。并非所有编译器都支持这一点。