"int main (vooid)"? Как это работает? - PullRequest
131 голосов
/ 14 февраля 2011

Мне недавно пришлось набрать небольшую тестовую программу на Си, и в процессе я допустил орфографическую ошибку в основной функции, случайно используя 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

Ответы [ 4 ]

219 голосов
/ 14 февраля 2011

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

68 голосов
/ 14 февраля 2011

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

23 голосов
/ 14 февраля 2011

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

20 голосов
/ 14 февраля 2011

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

...