-2

此代码是否遵循 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");
    }
}

如果不是,为什么?

4

3 回答 3

8

有一个错误:&"Hello Stackoverflow"没有 type char*,所以你不应该将它传递给期望该类型的函数。

除此之外,标准允许该程序作为特定于实现的扩展,但编译器可以自由拒绝它。

程序启动时调用的函数名为main. 实现没有声明这个函数的原型。它应定义为返回类型int且不带参数:

int main(void) { /* ... */ }

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

int main(int argc, char *argv[]) { /* ... */ }

或同等学历; 或以其他一些实现定义的方式

(2011 标准,最新草案第 5.1.2.2.1 节,已添加重点。)

C 标准中没有禁止递归调用main。这是与 C++ 的区别,它确实禁止这样做。

于 2012-07-18T18:20:32.987 回答
2

你的意思是旁边它不会运行? main被定义为int, char**作为参数。

根据编译器的不同,这可能会因为运行时找不到而无法启动main(int, char**),或者在较旧的编译器上它只会崩溃,因为它会在堆栈上乱跑。

于 2012-07-18T18:20:00.703 回答
2

它仅在 C99 及更高版本下有效,如果实现明确记录main可能采用 5 个参数(4int和 1 char *)并返回void(这是 larsmans 在他现在未删除的答案中引用的“或以某种其他实现定义的方式”子句,而且我认为 C89 中不存在该条款)。

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

于 2012-07-18T18:24:10.470 回答