返回主要功能的类型

Chi*_*abh 7 c

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

我一直在使用C中的main方法

void main(){ // my code }
Run Code Online (Sandbox Code Playgroud)

它对我来说效果很好.我也知道其他的 int返回类型:

int main(void)
int main()
int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

但是我找不到任何可以void用作返回类型的资源.每本书都建议返回类型必须int或者省略.然后为什么void main()工作?

这取决于我使用的C版本吗?或者它是否有效,因为我使用的是C++ IDE?请具体回复C而不是C++.

Jon*_*ler 11

只有书籍作者似乎知道允许返回类型为voidfor 的地方main().C++标准完全禁止它.

C标准说标准形式是:

int main(void) { ... }
Run Code Online (Sandbox Code Playgroud)

int main(int argc, char **argv) { ... }
Run Code Online (Sandbox Code Playgroud)

允许参数类型的替代但等效形式的声明(当然,名称完全是自由裁量的,因为它们是函数的局部变量).

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[]该参数指向以null结尾的指针数组char,每个指针指向一个字符串,该字符串提供有关此程序执行环境的信息(5.1.2.2.1 ).

为什么void main()工作?

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