pax*_*blo 132 c syntax program-entry-point
我最近不得不输入一个小的C测试程序,在这个过程中,我在主函数中意外地使用vooid而不是使用拼写错误void.
然而它仍然有效.
将它减少到最小的完整版本,我最终得到:
int main (vooid) {
return 42;
}
Run Code Online (Sandbox Code Playgroud)
这确实是 compile(gcc -Wall -o myprog myprog.c),并且在运行时它返回42.
这个有效代码到底是怎么回事?
这是从我的bashshell 剪切并粘贴的成绩单,以显示我正在做的事情:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
Run Code Online (Sandbox Code Playgroud)
Oli*_*rth 219
它只是使用"旧式"函数声明语法; 你隐式声明了一个int名为的参数vooid.
Mic*_*eyn 68
它是有效的代码,因为myprog.c包含:
int main (vooid) // vooid is of type int, allowed, and an alias for argc
{
return 42; // The answer to the Ultimate Question
}
Run Code Online (Sandbox Code Playgroud)
vooid包含一个加上传递的参数数量(即argc).所以,实际上你所做的一切是重命名argc来vooid.
vpi*_*833 20
只有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进行了测试.