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