这个代码在任何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) { /* ... */ } 

或者使用两个参数(这里称为argcargv ,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):

 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中)。

否则行为是未定义的,这意味着编译器可能会或可能不会阻塞它。