Недавно мне пришлось набрать небольшую тестовую программу на Си, и в процессе я допустил орфографическую ошибку в основной функции, случайно использовав 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
main
из стандартных двух канонических. Для переносимости, вы должны использовать один из этих двух, но я не думаю, что UB применяется здесь.
main
должна быть одна из 2 канонических форм (2.1.2.2). Но вы правы @pax, в автономной среде идентификатор main
ни в коем случае не является особенным: если он используется как функция, он может быть любого типа и иметь любое количество параметров любого типа.
int main (int argc, char *argv[], char *envp[]);
соответствовать ).
int
параметра, вы вызываете Undefined Behavior . Все может случиться :)