C's Most Vexing Parse Revisited
Das berüchtigte „Most Vexing Parse“-Phänomen in C entsteht, wenn eine scheinbar harmlose Aussage interpretiert werden kann entweder als Funktionsdeklaration oder als Variablendeklaration. Dies kann zu unerwartetem Verhalten und schwer zu debuggenden Fehlern führen.
Ein klassisches Beispiel ist das Code-Snippet:
widget w( gadget(), doodad() );
Auf den ersten Blick scheint es sich hierbei um eine Variablendeklaration für a zu handeln Widget mit dem Namen w mit einem in Klammern gesetzten Initialisierer. Bei näherer Betrachtung stellen wir jedoch fest, dass es sich bei „gadget()“ und „doodad()“ um Funktionsaufrufe handelt, die die Anweisung zu einer Funktionsdeklaration machen.
Die Mehrdeutigkeit entsteht, weil Funktionsargumente vom Typ „Array“ in Zeiger auf ihr erstes Element zerfallen. während Funktionsargumente vom Typ Funktion in Funktionszeiger zerfallen. Dies bedeutet, dass die Signatur der obigen Funktion tatsächlich wie folgt lautet:
widget w( gadget(*)(), doodad(*)() );
Mit anderen Worten: Sie nimmt zwei Funktionszeiger als Argumente und gibt ein Widget zurück.
Noch verwirrendere Fälle treten bei Variablen auf beteiligt sind:
widget w(gadget(x));
Da x eine Variable ist, scheint es unmöglich, dies als Funktionsdeklaration zu interpretieren. C erlaubt jedoch zusätzliche Klammern in Variablendeklarationen. Somit sind beide Gadgets x; und Gadget (x); deklarieren Sie dieselbe Variable x.
Daher könnte der obige Code als Funktionsdeklaration geparst werden, die ein einzelnes Argument vom Typ Gadget namens x akzeptiert und ein Widget zurückgibt. Dies zeigt, wie wichtig es ist, die Feinheiten der C-Syntax zu verstehen, um diese subtilen Fallstricke zu vermeiden.
Das obige ist der detaillierte Inhalt vonWarum interpretiert Cs „Most Vexing Parse' Variablendeklarationen fälschlicherweise als Funktionsdeklarationen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!