"int main(vooid)"?这是如何运作的?

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.

  • Aargghh,你是对的.如果我添加`-std = c99`,我会得到`qq.c:1:警告:'vooid'的类型默认为'int'. (43认同)
  • 这似乎是这种情况.如果添加"vooid = 42;返回vooid;" 对于main,您还可以获得42的返回值. (2认同)

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).所以,实际上你所做的一切是重命名argcvooid.

  • 如果你做"返回vooid"; 相反,它确实给了1 + num.args. (11认同)
  • @Jeff,程序的名称被计为一个争论,因此+ 1 (6认同)

Chi*_*chi 23

在C中,函数参数的默认类型是int.所以,你的程序将单词vooid视为int main(int vooid),这是完全有效的代码.


vpi*_*833 20

只有gcc -std=c89 -Wall -o qq qq.cgcc -std=gnu89 -Wall -o qq qq.c不发出警告.所有其他标准发出有关隐式类型的警告intvooid.

int main(chart)行为方式与此相同int main (vooid).

return vooid; 返回命令行参数的数量.

我在Debian测试系统上使用gcc 4.4.5进行了测试.