Niedawno musiałem wpisać mały program testowy w języku C i podczas tego procesu popełniłem błąd w pisowni w funkcji głównej, przypadkowo używając vooid
zamiast void
.
A jednak nadal działało.
Sprowadzając go do najmniejszej pełnej wersji, otrzymałem:
int main (vooid) {
return 42;
}
To rzeczywiście kompiluje ( gcc -Wall -o myprog myprog.c
) i po uruchomieniu zwraca 42.
Jak dokładnie jest ten prawidłowy kod?
Oto transkrypcja wycięta i wklejona z mojej bash
powłoki, aby pokazać, co robię:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
main
spośród standardowych dwóch kanonicznych. Aby zapewnić przenośność, powinieneś użyć jednego z tych dwóch, ale nie sądzę, aby UB miało tutaj zastosowanie.
main
musi mieć jedną z 2 form kanonicznych (2.1.2.2). Ale masz rację @pax, w wolnostojącym środowisku identyfikator nie main
jest w żaden sposób specjalny: jeśli jest używany jako funkcja, może być dowolnego typu i mieć dowolną liczbę parametrów dowolnego typu.
int main (int argc, char *argv[], char *envp[]);
na zgodność ).
int
parametru, wywołujesz niezdefiniowane zachowanie . Wszystko może się zdarzyć :)