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
In C, the default type for a function argument is
int
. So, your program is treating the wordvooid
asint main(int vooid)
, which is perfectly valid code.It is only
gcc -std=c89 -Wall -o qq qq.c
andgcc -std=gnu89 -Wall -o qq qq.c
don't emit a warning. All the other standards emit a warning about implicit typeint
forvooid
.int main(chart)
behaves the same way as doesint main (vooid)
.return vooid;
returns the number of command line arguments.I tested with gcc 4.4.5 on Debian testing system.
It's valid code, because myprog.c contains:
vooid
contains one plus the number of arguments passed (i.e.,argc
). So, in effect all you've done is to renameargc
tovooid
.It's simply using the "old-style" function-declaration syntax; you're implicitly declaring an
int
parameter calledvooid
.