it-swarm-ru.tech

"int main (void)"? Как это работает?

Недавно мне пришлось набрать небольшую тестовую программу на C, и в процессе я допустил орфографическую ошибку в основной функции, случайно использовав vooid вместо void.

И все же это все еще работало.

Сокращая его до самой маленькой полной версии, я получил:

int main (vooid) {
    return 42;
}

Это делает действительно compile (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
131
paxdiablo

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

218
Oliver Charlesworth

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

67
Michael Goldshteyn

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

23
Chinmay Kanchi

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

19
vpit3833