Ответ 1
Он просто использует синтаксис описания функции "старый стиль"; вы неявно объявляете параметр int
под названием vooid
.
Недавно мне пришлось вводить небольшую C-тестовую программу, и в процессе я совершил орфографическую ошибку в основной функции, случайно используя vooid
вместо void
.
И все же он все еще работал.
Уменьшая его до самой маленькой полной версии, я закончил с:
int main (vooid) {
return 42;
}
Это действительно компилируется (gcc -Wall -o myprog myprog.c
), а при запуске возвращается 42.
Как именно этот действительный код?
Здесь транскрипция вырезана и вставлена из моей оболочки bash
, чтобы показать, что я делаю:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
Он просто использует синтаксис описания функции "старый стиль"; вы неявно объявляете параметр int
под названием vooid
.
Это действительный код, потому что myprog.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.c
и gcc -std=gnu89 -Wall -o qq qq.c
не выдают предупреждение. Все остальные стандарты выдают предупреждение о неявном типе int
для vooid
.
int main(chart)
ведет себя так же, как и int main (vooid)
.
return vooid;
возвращает количество аргументов командной строки.
Я тестировал gcc 4.4.5 в системе тестирования Debian.