Нещодавно мені довелося набрати невелику програму тестування на С, і під час цього я зробив орфографічну помилку в основній функції, випадково використовуючи 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параметра, ви викликаєте Невизначена поведінка . Будь-що може статися :)