【发布时间】:2010-10-12 19:37:16
【问题描述】:
在 C++(或 C)程序中声明 main 函数的方式有关系吗?
【问题讨论】:
标签: c++ c function standards main
在 C++(或 C)程序中声明 main 函数的方式有关系吗?
【问题讨论】:
标签: c++ c function standards main
不同的是,一个是main的正确定义方式,另一个不是。
是的,这很重要。要么
int main(int argc, char** argv)
或
int main()
是根据 C++ 规范对 main 的正确定义。
void main(int argc, char** argv)
IIRC 过去和现在都不是旧版 Microsoft C++ 编译器带来的变态。
【讨论】:
【讨论】:
您应该使用int main。 C 和 C++ 标准都规定 main 应该返回一个值。
【讨论】:
对于 C++,只允许使用 int。对于 C,C99 表示只允许使用 int。之前的标准允许 void 返回。
简而言之,总是int。
【讨论】:
关键是,C 程序(和 C++ 相同)总是(应该?)返回成功值或错误代码,所以它们应该这样声明。
【讨论】:
很久以前,我发现this page (void main(void)) 包含“标准说它无效”论点之外的许多原因。在特定的操作系统/架构上,它可能会导致堆栈损坏或发生其他令人讨厌的事情。
【讨论】:
如果您遵循规范,则应始终声明 main 返回 int。
不过,实际上,大多数编译器都会让你摆脱其中任何一种,所以真正的区别在于你是否想要/需要向 shell 返回一个值。
【讨论】:
在 C++ 中,main() 必须返回 int。但是,C99 允许 main() 具有非 int 返回类型。这是 C99 标准的摘录。
5.1.2.2.1 程序启动
程序启动时调用的函数名为 main。实现声明没有 这个函数的原型。它应定义为返回类型为 int 并且没有 参数:
int main(void) { /* ... */ }
或带有两个参数(此处称为 argc 和 argv,尽管任何名称都可以 使用,因为它们在声明它们的函数中是本地的):
int main(int argc, char *argv[]) { /* ... */ }
或同等学历; 或以其他一些实现定义的方式。
另请注意,gcc 确实会编译 void main(),尽管实际上它会在遇到右大括号时编译 return 0;。
【讨论】:
gcc -pedantic 会拒绝它。不使用-pedantic 就是搞砸了。
gcc -pedantic,这是否意味着我们没有使用标准C?其次,如果你告诉我它写在哪里,我将不胜感激。
gcc -pedantic,这是否意味着我们没有使用标准C?其次,如果你告诉我它写在哪里,我将不胜感激。
-pedantic 或-pedantic-errors。绝对没有理由使用不正确的返回类型,这只是草率(但请注意,独立的 C 实现具有不同的入口点函数!)。