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