acr*_*ige 5 c program-entry-point
标准说:
5.1.2.2.1程序启动
程序启动时调用的函数名为main.该实现声明此函数没有原型.它应该使用返回类型int并且没有参数来定义:int main(void){/*...*/}或者有两个参数(这里称为argc和argv,尽管可以使用任何名称,如它们是声明它们的函数的本地函数):int main(int argc,char argv []){/ ...*/}或等价物; 10)或以某种其他实现定义的方式.
如果我写这个:
#include <stdio.h>
struct some_struct
{
int i;
};
float main(struct some_struct s)
{
printf("Why does this main get called?\n");
}
Run Code Online (Sandbox Code Playgroud)
实际上,正如我所见,它被任何原型调用,并且没有任何运行时错误.
为什么不禁止它?这没有理由吗?另外,如果签名错误,如何调用它?
我用过 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
从标准一致性开始:
\n\n\n1 在本国际标准中,\xe2\x80\x98\xe2\x80\x98shall\xe2\x80\x99\xe2\x80\x99 应解释为对实现或程序的要求;反之,\xe2\x80\x98\xe2\x80\x98 不应被解释为禁止。
\n
\n\n2 如果\xe2\x80\x98\xe2\x80\x98shall\xe2\x80\x99\xe2\x80\x99 或 \xe2\x80\x98\xe2\x80\x98shall not\xe2\x80\x99\xe2\超出约束或运行时约束的x80\x99 要求被违反,行为未定义。[...]
\n
看看你引用的段落的重点:
\n\n\n[...]。它应定义为 int 返回类型和 [...]
\n
在这种情况下,
\nfloat main(struct some_struct s){...} \nRun Code Online (Sandbox Code Playgroud)\n“应”要求超出了约束范围,因为标准明确规定main返回类型应该是int不带参数的
int main(void) { /* ... */ } \nRun Code Online (Sandbox Code Playgroud)\n或有两个参数
\n int main(int argc, char argv[]) { / ... */ } \nRun Code Online (Sandbox Code Playgroud)\n这意味着您的程序的行为是未定义的。
\n