主要功能的返回类型

可能重复:
main()应该在C / C ++中返回什么?
void main和int main之间的区别?

我一直在使用C中的主要方法

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 ++。


只有书的作者似乎是厕所的地方的返回类型的地方voidmain()是允许的。 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)到达}那终止主函数返回值0.如果返回类型与int不兼容,则返回到主机环境的终止状态未指定。

11)根据6.2.4,在主体中声明自动存储时间的物体的寿命将在前一种情况下结束,即使在后一种情况下它们不存在的情况下。

这显然允许非int返回,但明确指出它没有指定。 因此, void可能被允许作为main()的返回类型,但是您只能从文档中找到它。

(虽然我引用了C2011标准,但基本上C99中的词语基本相同,我相信C89虽然是我的文本,但在办公室,而我不是。)

顺便提一句,标准的附录J提到:

J.5通用扩展

以下扩展在许多系统中广泛使用,但不适用于所有实现。 包含任何可能导致严格符合程序无效的扩展会导致实现不合格。 这种扩展的例子是新的关键字,在标准头文件中声明的额外的库函数,或者名称不以下划线开头的预定义宏。

J.5.1环境参数

在托管环境中, main函数接收第三个参数char *envp[] ,该参数指向以char为空的终止指针数组,每个指向一个字符串,该字符串提供有关执行计划(5.1.2.2.1)。

为什么void main()工作?

问题观察到void main()有效。 它“起作用”是因为编译器尽力为程序生成代码。 编译器如GCC会警告main()的非标准表单,但会处理它们。 链接器不太担心返回类型; 它只需要一个符号main (或者可能是_main ,取决于系统),当它找到它时,将它链接到可执行文件中。 启动代码假定main已经以标准方式定义。 如果main()返回到启动代码,它会收集返回值,就好像该函数返回一个int ,但该值可能是垃圾。 所以,只要你不寻找你的程序的退出状态,它似乎工作。


从马的嘴里:

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 (或任何其他类型),但它必须明确证明允许这样的签名。 否则,行为是不确定的,这意味着编译器可以做任何事情。 该程序可以执行没有任何问题。 它可能会执行,但会使环境处于不良状态。 它可能会在出口时崩溃。 它可能无法加载。


它依赖于你正在使用的编译器,但void main在任何地方都不可编译。 我看到编译器不会用void main编译程序。 我不记得特定的情况(对于C),但我知道这肯定发生在g ++中(是的,我知道这是c ++)。

链接地址: http://www.djcxy.com/p/28721.html

上一篇: Return type of main function

下一篇: Styles of main functions in C