【发布时间】:2011-06-26 14:57:04
【问题描述】:
我最近不得不输入一个小型 C 测试程序,在此过程中,我在 main 函数中犯了一个拼写错误,不小心使用了 vooid 而不是 void。
但它仍然有效。
将其缩减为最小的完整版本,我最终得到:
int main (vooid) {
return 42;
}
这确实编译 (gcc -Wall -o myprog myprog.c) 并且在运行时返回 42。
这个有效代码到底是多少?
这是从我的bash shell 剪切和粘贴的成绩单,以显示我在做什么:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
【问题讨论】:
-
通过使用单个
int参数定义 main,您可以调用 Undefined Behaviour。任何事情都有可能发生:) -
实际上,我不确定 UB,@pmg。 ISO 特别允许标准两个规范的
main的其他可能性。为了便携性,您应该使用这两者之一,但我认为 UB 不适用于此处。 -
嗯:在托管环境中
main必须具有两种规范形式 (2.1.2.2) 之一。但你说得对@pax,在独立环境中,标识符main一点也不特别:如果用作函数,它可以是任何类型,并且可以具有任意数量的任何类型的参数。 -
在 C99 中,独立是完全由实现定义的。对于托管,第 5.1.2.2.1 节最后声明“或以其他实现定义的方式”,因此它至少需要两种规范形式,但也可以有其他形式(这将允许 UNIXy
int main (int argc, char *argv[], char *envp[]);符合)。