【问题标题】:Why do people use `main()` instead of `int main()` in C++?为什么人们在 C++ 中使用 `main()` 而不是 `int main()`?
【发布时间】:2017-02-17 04:37:46
【问题描述】:

在 C 中可以使用 main() 代替 int main(),但这是 outdated practice。但是我看到人们在 C++ 中使用 main() 而不是 int main()。如果他们使用main(),他们的意思是void main(),就像this question一样吗?

【问题讨论】:

  • AFAIK,它是非标准的,如果您的警告足够高,将导致编译错误。我想编译器出于遗留原因支持它,例如 C++ 与 ANSI C 兼容这一事实,当时需要支持没有初始 int 的遗留 C 代码,所以它可能级联到现代C++ 编译器。但这都是我的猜测,我可能错了。
  • 如果来自C,则隐式返回类型为int,而不是void,因此比void main更正确。不过还是很丑;自第一个 ANSI C 标准以来,隐式返回类型就被人们所反对。
  • 即使在 C 中,现代 C 编译器在向后兼容模式下工作时也只接受 main() 而不是 int main()。 GCC 5.x 及更高版本默认为 C11 模式,其中“plain main()”是不可接受的,而 GCC 4.x 及更早版本默认为 C90 模式,这是可以的。自 90 年代初以来,它(普通的 main())在“标准”(严格)C++ 中一直不好用。一些编译器可能仍然允许它(同样,出于向后兼容性的原因),但它并不好。因此,任何用现代代码编写简单的main() 的人都做错了。在旧代码中遇到普通 main() 的任何人都应该更新它。
  • @ShadowRanger 这就是我的想法,但我可能认为使用 main() 可能意味着 C++ 中的一些新内容,例如 void main()。在 Internet 上找不到 C++ 中的隐含含义。
  • 不,在 GCC 和 Clang 等编译器下,这是对 C++ 的扩展,以保留旧的 C 行为。不像void main这样的变化。

标签: c++


【解决方案1】:

有趣。我理解你的问题,彼得。 但是现在没有人在没有原型的情况下使用 main() 声明。 你问的问题是关于旧的 c 标准,但我们在 c 标准 11 中。所以不要指望旧的 main() 声明。在旧的 c 标准中,如果函数什么都不返回,那么他们曾经假设返回一个整数。希望这能解释你的问题。 如果您有更多疑问,请参考 查看链接 http://ee.hawaii.edu/~tep/EE160/Book/chapapx/node7.html 我认为它曾经返回 所以以同样的方式 c++ 标准可能支持旧标准。

您现在发现的最常见的声明是
int main(int argc, char** argv) 或者 主函数() 或者 无效的主要()

【解决方案2】:

当使用当前版本的 GCC 时,它们都编译成完全相同的输出:

int main(int argc, char* argv[]) { ... }

main(int argc, char* argv[]) { ...}

因此,我认为int 是隐含的。

【讨论】:

  • 您在说哪个“当前版本的 GCC”?无论如何,它不是 5.x 或 6.x 编译器。或者你的意思是来自 GCC 的 g++ 编译器(而不是 gcc)。使用g++ 并且没有选项,它确实可以毫无怨言地编译g++ 6.3.0;与gcc 6.3.0 相同的代码不会在没有警告的情况下编译。
  • 对不起,你是对的——g++,具体来说:g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
  • 我有点惊讶地发现它在 G++ 的默认选项下编译时没有警告;我知道它不会在 GCC 下。它需要-pedantic-Wall 或类似的东西来从g++ 引发警告——即使-std=c++11-std=c++14 也是不够的。我想它仍然是允许的,因为它在实践中仍然很普遍,并且它在实践中部分地普遍,因为它在默认选项下仍然是允许的。尽管任何人在没有-Wall或更严格的选项的情况下进行编译是任何人的猜测。
猜你喜欢
  • 2010-10-01
  • 2011-09-24
  • 2016-09-15
  • 2018-03-16
  • 2011-03-10
  • 2013-11-04
  • 2013-09-01
  • 2016-01-05
  • 2010-09-06
相关资源
最近更新 更多