返回主要功能的类型

时间:2012-06-06 13:57:30

标签: c

  

可能重复:
  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 ++。

5 个答案:

答案 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)

来自horse's mouth

5.1.2.2.1程序启动

1程序启动时调用的函数名为main。实施宣布否 这个功能的原型。它应该定义为int的返回类型,而不是 参数:

    int main(void) { /* ... */ }
或者有两个参数(这里称为argcargv,但可能有任何名称 使用,因为它们是声明它们的函数的本地符号):

    int main(int argc, char *argv[]) { /* ... */ }
或同等的; 9) 或者以某种其他实现方式定义。
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