Ich musste kürzlich ein kleines C-Testprogramm eingeben und habe dabei einen Rechtschreibfehler in der Hauptfunktion gemacht, indem ich versehentlich vooid
anstelle von verwendet habe void
.
Und trotzdem hat es funktioniert.
Als ich es auf die kleinste vollständige Version reduzierte, endete ich mit:
int main (vooid) {
return 42;
}
Dies kompiliert tatsächlich ( gcc -Wall -o myprog myprog.c
) und gibt beim Ausführen 42 zurück.
Wie genau ist dieser gültige Code?
Hier ist ein Transkript, das aus meiner bash
Shell ausgeschnitten und eingefügt wurde, um zu zeigen, was ich tue:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
main
von den Standard zwei kanonischen. Für die Portabilität sollten Sie eine dieser beiden verwenden, aber ich denke nicht, dass UB hier gilt.
main
muss eine der beiden kanonischen Formen vorliegen (2.1.2.2). Aber Sie haben Recht @pax, in einer freistehenden Umgebung ist der Bezeichner main
in keiner Weise speziell: Wenn er als Funktion verwendet wird, kann er von einem beliebigen Typ sein und eine beliebige Anzahl von Parametern eines beliebigen Typs haben.
int main (int argc, char *argv[], char *envp[]);
konform zu sein ).
int
Parameter definieren, rufen Sie Undefined Behavior auf . Alles kann passieren :)