“ int main (void)”? 这是怎么回事?

我最近不得不输入一个小的 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
5904 次浏览

它只是使用“旧式”函数声明语法; 您隐式地声明了一个名为 vooidint参数。

这是有效的代码,因为 mypro.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

在 C 语言中,函数参数的默认类型是 int。因此,您的程序将单词 vooid视为 int main(int vooid),这是完全有效的代码。

只有 gcc -std=c89 -Wall -o qq qq.cgcc -std=gnu89 -Wall -o qq qq.c不发出警告。所有其他标准都会对 vooid的隐式类型 int发出警告。

int main(chart)的行为方式与 int main (vooid)相同。

return vooid;返回命令行参数的个数。

我在 Debian 测试系统上测试了 gcc 4.4.5。