Недавно мне пришлось набрать небольшую тестовую программу на Си, и в процессе я допустил орфографическую ошибку в основной функции, случайно использовав 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
int
параметра, вы вызываете Undefined Behavior . Все может случиться :)main
из стандартных двух канонических. Для переносимости, вы должны использовать один из этих двух, но я не думаю, что UB применяется здесь.main
должна быть одна из 2 канонических форм (2.1.2.2). Но вы правы @pax, в автономной среде идентификаторmain
ни в коем случае не является особенным: если он используется как функция, он может быть любого типа и иметь любое количество параметров любого типа.int main (int argc, char *argv[], char *envp[]);
соответствовать ).Ответы:
Он просто использует синтаксис объявления функции в "старом стиле"; вы неявно объявляете
int
параметр с именемvooid
.источник
-std=c99
, я получуqq.c:1: warning: type of 'vooid' defaults to 'int'
.Это правильный код, потому что myprog.c содержит:
vooid
содержит один плюс количество переданных аргументов (т. е.argc
). Таким образом, в действительности все , что вы сделали, чтобы переименоватьargc
вvooid
.источник
В С типом по умолчанию для аргумента функции является
int
. Итак, ваша программа обрабатывает словоvooid
какint main(int vooid)
, что является совершенно правильным кодом.источник
Это только
gcc -std=c89 -Wall -o qq qq.c
иgcc -std=gnu89 -Wall -o qq qq.c
не издают предупреждение. Все остальные стандарты выдают предупреждение о неявном типеint
forvooid
.int main(chart)
ведет себя так же, как иint main (vooid)
.return vooid;
возвращает количество аргументов командной строки.Я тестировал с gcc 4.4.5 в системе тестирования Debian.
источник