最近,我不得不输入一个小型的C测试程序,在此过程中,我偶然通过使用vooid
而不是来在主要功能中犯了一个拼写错误void
。
但是它仍然有效。
将其缩减为最小的完整版本,最终得到:
int main (vooid) {
return 42;
}
但这确实编译(gcc -Wall -o myprog myprog.c
),并在运行时,它会返回42。
此有效代码到底有多正确?
这是一个从我的bash
外壳剪切并粘贴的成绩单,以显示我在做什么:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
实际上,我不确定UB @pmg。ISO特别允许
—
paxdiablo 2011年
main
从标准两个规范的其他可能性。对于可移植性,您应该使用这两种方法之一,但是我认为UB在这里不适用。
嗯:在托管环境中,
—
2011年
main
必须具有以下两种规范形式(2.1.2.2)之一。但是@pax是正确的,在独立的环境中,标识符main
绝非特别:如果用作函数,则标识符可以是任何类型,并且可以具有任意数量的任何类型的参数。
在C99中,独立性是完全实现的定义。对于托管,第5.1.2.2.1节在末尾“或以其他一些实现定义的方式”声明,因此它至少需要两种规范形式,但也可以具有其他规范形式(这将使UNIXy
—
paxdiablo 2011年
int main (int argc, char *argv[], char *envp[]);
符合标准) )。
int
参数定义main ,可以调用Undefined Behavior。什么都可能发生:)