可能重复:
What should main() return in C/C++?
Difference between void main and int main?
我一直在使用C中的main方法
void main(){ // my code }
对我来说效果很好。
我也知道其他int
返回类型:
int main(void)
int main()
int main(int argc, char *argv[])
但是我找不到任何可以使用void
作为返回类型的资源。每本书都建议返回类型必须为int
,否则将被省略。那么为什么void main()
有用呢?
这取决于我使用的C版本吗?或者它是否有效,因为我使用的是C ++ IDE?请具体回复C而不是C ++。
答案 0 :(得分:11)
只有图书作者似乎知道允许void
的返回类型为main()
的地方。 C ++标准完全禁止它。
C标准说标准形式是:
int main(void) { ... }
和
int main(int argc, char **argv) { ... }
允许参数类型的替代但等效形式的声明(当然,名称完全是自由裁量的,因为它们是函数的局部变量)。
C标准确实为“以某种其他实现定义的方式”做了一些小规定。 ISO / IEC 9899:2011标准说:
5.1.2.2.3程序终止
如果
main
函数的返回类型是与int
兼容的类型,则返回 对main
函数的初始调用等同于使用值调用exit
函数 由main
函数返回作为其参数; 11)到达}
终止 main函数返回值0.如果返回类型与int
不兼容,则 返回到主机环境的终止状态未指定。11)根据6.2.4,主要声明自动存储持续时间的对象的生命周期 将在前一种情况下结束,即使他们不会在后一种情况下。
这显然允许非int
返回,但明确指出它没有指定。因此,某些实现可能允许void
作为main()
的返回类型,但您只能从文档中找到它。
(虽然我引用的是C2011标准,基本上相同的单词都是在C99中,我相信C89虽然我的文字是在办公室,但我不是。)
顺便提一下,标准的附录J提到:
J.5通用扩展
以下扩展在许多系统中被广泛使用,但并不是所有系统都可移植 实现。包含可能导致严格符合的任何扩展名 程序变为无效会导致实现不一致。这样的例子 扩展是新关键字,在标准头中声明的额外库函数,或 名称不以下划线开头的预定义宏。
J.5.1环境参数
在托管环境中,
main
函数接收第三个参数char *envp[]
, 指向以char
为指针的以null结尾的指针数组,每个指针都指向一个字符串 它提供有关此程序执行环境的信息 (5.1.2.2.1)。
void main()
有效?问题是void main()
有效。它“有效”,因为编译器尽力为程序生成代码。像GCC这样的编制者会警告main()
的非标准表格,但会处理它们。链接器不太担心返回类型;它只需要符号main
(或可能_main
,具体取决于系统),当它找到它时,将其链接到可执行文件中。启动代码假定已以标准方式定义main
。如果main()
返回到启动代码,它会收集返回的值,就像函数返回int
一样,但该值可能是垃圾。因此,只要您不查找程序的退出状态,它就会起作用。
答案 1 :(得分:2)
5.1.2.2.1程序启动
1程序启动时调用的函数名为main
。实施宣布否 这个功能的原型。它应该定义为int
的返回类型,而不是 参数:
或者有两个参数(这里称为int main(void) { /* ... */ }
argc
和argv
,但可能有任何名称 使用,因为它们是声明它们的函数的本地符号):
或同等的; 9) 或者以某种其他实现方式定义。int main(int argc, char *argv[]) { /* ... */ }
9)因此,int可以替换为定义为int的typedef名称,或者argv的类型可以写为 char ** argv,等等。
漏洞是“其他一些实现定义的方式”。实现可以允许main
返回void
(或任何其他类型),但必须明确记录允许此类签名。否则行为是未定义的,这意味着编译器可以执行任何想要的操作。程序可以毫无问题地执行。它可能会执行,但会使环境处于不良状态。退出时可能会崩溃。它可能根本无法加载。
答案 2 :(得分:0)
它取决于您使用的编译器,但void main无法在任何地方编译。我见过编译器无法使用void main编译程序。我不记得具体的情况(对于c),但我肯定知道这发生在g ++中(是的,我知道这是c ++)。
答案 3 :(得分:0)
标准要求main()
返回int
,但很多C编译器允许您将main()
的返回类型指定为void
。
我建议你养成回归int
的习惯。添加
return 0;
到main()
的末尾并没有太多的努力。
答案 4 :(得分:-1)
我在C89中是可以接受的,但它不再被认为是“安全的”。在C99下,它已不再可接受。
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284376&answer=1044841143