我最近不得不输入一个小的C测试程序,在这个过程中,我在主函数中意外地使用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
答案 0 :(得分:218)
它只是使用“旧式”函数声明语法;您隐式声明了名为int
的{{1}}参数。
答案 1 :(得分:67)
这是有效的代码,因为myprog.c包含:
int main (vooid) // vooid is of type int, allowed, and an alias for argc
{
return 42; // The answer to the Ultimate Question
}
vooid
包含一个加上传递的参数数量(即argc
)。因此,实际上您所做的就是将argc
重命名为vooid
。
答案 2 :(得分:23)
在C中,函数参数的默认类型是int
。因此,您的计划将vooid
一词视为int main(int vooid)
,这是完全有效的代码。
答案 3 :(得分:19)
仅gcc -std=c89 -Wall -o qq qq.c
和gcc -std=gnu89 -Wall -o qq qq.c
不会发出警告。所有其他标准都会针对int
的隐式类型vooid
发出警告。
int main(chart)
的行为与int main (vooid)
的行为方式相同。
return vooid;
返回命令行参数的数量。
我在Debian测试系统上使用gcc 4.4.5进行了测试。