“int main (vooid)”? How does that work?

拜拜、爱过 提交于 2019-11-28 14:40:27

问题


I recently had to type in a small C test program and, in the process, I made a spelling mistake in the main function by accidentally using vooid instead of void.

And yet it still worked.

Reducing it down to its smallest complete version, I ended up with:

int main (vooid) {
    return 42;
}

This does indeed compile (gcc -Wall -o myprog myprog.c) and, when run, it returns 42.

How exactly is this valid code?


Here's a transcript cut and pasted from my bash shell to show what I'm doing:

pax$ cat qq.c
int main (vooid) {
    return 42;
}

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq

pax$ echo $?
42

回答1:


It's simply using the "old-style" function-declaration syntax; you're implicitly declaring an int parameter called vooid.




回答2:


It's valid code, because myprog.c contains:

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooid contains one plus the number of arguments passed (i.e., argc). So, in effect all you've done is to rename argc to vooid.




回答3:


In C, the default type for a function argument is int. So, your program is treating the word vooid as int main(int vooid), which is perfectly valid code.




回答4:


It is only gcc -std=c89 -Wall -o qq qq.c and gcc -std=gnu89 -Wall -o qq qq.c don't emit a warning. All the other standards emit a warning about implicit type int for vooid.

int main(chart) behaves the same way as does int main (vooid).

return vooid; returns the number of command line arguments.

I tested with gcc 4.4.5 on Debian testing system.



来源:https://stackoverflow.com/questions/4987415/int-main-vooid-how-does-that-work

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!