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