此代码是否遵循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");
}
}
如果没有,为什么?
答案 0 :(得分:8)
有一个错误:&"Hello Stackoverflow"
没有类型char*
,因此您不应将其传递给期望该类型的函数。
除此之外,标准允许该程序作为特定于实现的扩展,但编译器可以自由拒绝它。
程序启动时调用的函数名为
main
。实施宣布否 这个功能的原型。它应定义为返回类型int
且没有 参数:
int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):
int main(int argc, char *argv[]) { /* ... */ }
或同等的; 或以其他一些实现定义的方式。
(2011年标准,最新草案第5.1.2.2.1节,增加了重点。)
C标准中对main
的递归调用没有禁止。这与C ++不同,后者确实取消了这一点。
答案 1 :(得分:2)
你的意思是它旁边不会运行? main
被定义为将int, char**
作为参数。
根据编译器的不同,这将无法启动,因为运行时无法找到main(int, char**)
,或者在较旧的编译器上它会崩溃,因为它会堆叠在堆栈上。
答案 2 :(得分:2)
它仅在C99及更高版本下有效,如果实现显式文档main
可能需要5个参数(4 int
和1 char *
)并返回{ {1}}(这是larsmans在他现在未删除的答案中引用的“或其他一些实现定义的方式”条款,我不认为该条款存在于C89中)。
否则行为未定义,这意味着编译器可能会或可能不会阻塞它。