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
int
parametru, wywołujesz niezdefiniowane zachowanie . Wszystko może się zdarzyć :)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 niemain
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ść ).Odpowiedzi:
Po prostu używa "starego stylu" składni deklaracji funkcji; niejawnie deklarujesz
int
parametr o nazwievooid
.źródło
-std=c99
, dostanęqq.c:1: warning: type of 'vooid' defaults to 'int'
.To prawidłowy kod, ponieważ myprog.c zawiera:
vooid
zawiera jeden plus liczbę przekazanych argumentów (tjargc
.). W efekcie wszystko, co zrobiłeś, to zmiana nazwyargc
navooid
.źródło
W języku C domyślnym typem argumentu funkcji jest
int
. Zatem twój program traktuje słowovooid
jakoint main(int vooid)
, co jest całkowicie poprawnym kodem.źródło
To tylko
gcc -std=c89 -Wall -o qq qq.c
igcc -std=gnu89 -Wall -o qq qq.c
nie wysyłaj ostrzeżenia. Wszystkie inne standardy wysyłają ostrzeżenie o niejawnym typieint
dlavooid
.int main(chart)
zachowuje się tak samo jak robiint main (vooid)
.return vooid;
zwraca liczbę argumentów wiersza poleceń.Testowałem z gcc 4.4.5 w systemie testowym Debiana.
źródło