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
int
Parameter definieren, rufen Sie Undefined Behavior auf . Alles kann passieren :)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 Bezeichnermain
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 ).Antworten:
Es wird einfach die Syntax der Funktionsdeklaration im "alten Stil" verwendet. Sie deklarieren implizit einen
int
Parameter namensvooid
.quelle
-std=c99
, bekomme ichqq.c:1: warning: type of 'vooid' defaults to 'int'
.Es ist ein gültiger Code, da myprog.c Folgendes enthält:
vooid
enthält eins plus die Anzahl der übergebenen Argumente (dhargc
). Also in der Tat alles , was Sie getan haben , ist zu umbenennenargc
zuvooid
.quelle
In C ist der Standardtyp für ein Funktionsargument
int
. Ihr Programm behandelt das Wort alsovooid
als einenint main(int vooid)
vollkommen gültigen Code.quelle
Es ist nur
gcc -std=c89 -Wall -o qq qq.c
undgcc -std=gnu89 -Wall -o qq qq.c
keine Warnung ausgeben. Alle anderen Standards geben eine Warnung über den impliziten Typint
für ausvooid
.int main(chart)
verhält sich genauso wieint main (vooid)
.return vooid;
Gibt die Anzahl der Befehlszeilenargumente zurück.Ich habe mit gcc 4.4.5 auf dem Debian-Testsystem getestet.
quelle