此代码是否遵循 C 标准(例如 C89、C99、C10x)?
void
main(int a,int b, int c, int d,char *msg){
if(d==1){
printf("%s\n",msg);
}else{
main(1,2,3,1,&"Hello Stackoverflow");
}
}
如果不是,为什么?
有一个错误:&"Hello Stackoverflow"
没有 type char*
,所以你不应该将它传递给期望该类型的函数。
除此之外,标准允许该程序作为特定于实现的扩展,但编译器可以自由拒绝它。
程序启动时调用的函数名为
main
. 实现没有声明这个函数的原型。它应定义为返回类型int
且不带参数:
int main(void) { /* ... */ }
或带有两个参数(这里称为
argc
andargv
,尽管可以使用任何名称,因为它们对于声明它们的函数是本地的):
int main(int argc, char *argv[]) { /* ... */ }
或同等学历; 或以其他一些实现定义的方式。
(2011 标准,最新草案第 5.1.2.2.1 节,已添加重点。)
C 标准中没有禁止递归调用main
。这是与 C++ 的区别,它确实禁止这样做。
你的意思是旁边它不会运行? main
被定义为int, char**
作为参数。
根据编译器的不同,这可能会因为运行时找不到而无法启动main(int, char**)
,或者在较旧的编译器上它只会崩溃,因为它会在堆栈上乱跑。
它仅在 C99 及更高版本下有效,如果实现明确记录main
可能采用 5 个参数(4int
和 1 char *
)并返回void
(这是 larsmans 在他现在未删除的答案中引用的“或以某种其他实现定义的方式”子句,而且我认为 C89 中不存在该条款)。
否则行为是未定义的,这意味着编译器可能会或可能不会阻塞它。