主要功能的返回类型
可能重复:
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 ++。
只有书的作者似乎是厕所的地方的返回类型的地方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)到达}
那终止主函数返回值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) { /* ... */ }
或者带有两个参数(这里称为argc
和argv
,尽管可以使用任何名称,因为它们是声明它们的函数的本地):
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