"int main (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

Ответ 1

Он просто использует синтаксис описания функции "старый стиль"; вы неявно объявляете параметр int под названием vooid.

Ответ 2

Это действительный код, потому что 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.

Ответ 3

В C тип по умолчанию для аргумента функции int. Таким образом, ваша программа обрабатывает слово vooid как int main(int vooid), что является вполне допустимым кодом.

Ответ 4

Только 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.