Heim > Backend-Entwicklung > C++ > Warum interpretiert Cs „Most Vexing Parse' Variablendeklarationen fälschlicherweise als Funktionsdeklarationen?

Warum interpretiert Cs „Most Vexing Parse' Variablendeklarationen fälschlicherweise als Funktionsdeklarationen?

Barbara Streisand
Freigeben: 2024-12-01 13:12:12
Original
334 Leute haben es durchsucht

Why Does C  's

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() );
Nach dem Login kopieren

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(*)() );
Nach dem Login kopieren

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));
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage