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

此代码在任何C标准下都有效吗?,c,main,C,Main,此代码是否遵循C标准(例如C89、C99、C10x) 如果没有,为什么?你是说它不会运行main被定义为将int,char**作为参数 根据编译器的不同,它可能无法启动,因为运行时找不到main(int,char**),或者在较旧的编译器上,它只会崩溃,因为它在堆栈上出现了碎片。有一个错误:和“Hello Stackoverflow”没有类型char*,因此,不应该将其传递给期望该类型的函数 除此之外,标准允许该程序作为特定于实现的扩展,但编译器有权拒绝它 程序启动时调用的函数名为main。实现

此代码是否遵循C标准(例如C89、C99、C10x)


如果没有,为什么?

你是说它不会运行
main
被定义为将
int,char**
作为参数

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

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

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

程序启动时调用的函数名为
main
。实现声明没有 此功能的原型。应定义返回类型为
int
,且无 参数:

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

或同等品或以某种其他实现定义的方式

(2011年标准,最新草案第5.1.2.2.1节,增加了重点。)


在C标准中没有禁止递归调用
main
。这与C++是不同的,它是非法的。

< p>它只在C99之后生效,如果实现显式地证明了<代码>主< /C> >可以取5个参数(4代码> int <代码> 1,代码> char */COD>),返回<代码>无效>代码>(这是“或在其他一些实现定义的方式中””拉斯曼在他现在未删除的答案中引用的条款,我认为该条款在C89中不存在


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

Main应返回int,程序无效。参数列表也无效&“字符串常量”毫无意义。printf未定义。@wildplasser我非常确定C99下允许使用
&“literal”
。如果
t
是一个数组,为什么它不被允许比
&t
更少呢?我没有说它是非法的,我说它毫无意义。
&“literal”
有类型
常量字符(*)[8]
,或者“指向
常量字符的数组8的指针”。允许将其转换为
char*
,但是如果它缺少强制转换(正如这里所做的),编译器通常会警告这种类型的转换,因为它通常表示错误。@AdamRosenfield,不,这是标准不允许的。指针类型的隐式转换违反了约束。+1,但是对
main
的递归调用具有错误类型的参数,因此这是违反约束的。
&
应该省略。在范围内没有原型的情况下调用
printf()
(或任何具有可变参数数的函数)也是未定义的行为。@pmg:我曾隐式假设
#include
。请随意将此编辑到答案中,我有点累(抱歉)。
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");
    }
}
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }