这个代码在任何C标准下都有效吗?

时间:2012-07-18 18:15:48

标签: c main

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

如果没有,为什么?

3 个答案:

答案 0 :(得分:8)

有一个错误:&"Hello Stackoverflow"没有类型char*,因此您不应将其传递给期望该类型的函数。

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

  

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应定义为返回类型int且没有   参数:

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

或有两个参数(此处称为argcargv,但可能有任何名称   使用,因为它们是声明它们的函数的本地函数):

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

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