Bin ich wirklich richtig, dass C-Standards garantieren, dass _ _ func _ _ value immer der Name der einschließenden Funktion ist, während in C ++ (ich meine natürlich C ++ 11) jede implementationsdefinierte Zeichenkette ( Zum Beispiel, wenn wir die Funktion foo ohne Parameter haben, können wir etwas wie "Einige Zeichenketten fdgdg asdfs fsdf sd" bekommen?
ISO / IEC 9899: 2011
6.4.2.2 Vordefinierte Identifikatoren
Semantik
1 Der Bezeichner _ _ func _ _ wird implizit von der .de erklärt Übersetzer als ob, unmittelbar nach der Eröffnung Klammer von jedem Funktionsdefinition, die Deklaration statisch const char _ func _ [] = "Funktionsname"; erschienen, wobei funktionsname der Name des lexikalisch umschließende Funktion .
ISO / IEC 14882: 2011
8.4.1 Allgemein [dcl.fct.def.general]
8 Die vordefinierte funktionale Variable _ _ func _ _ ist definiert als ob a Definition der Form statisch const char _ _ func _ _ []="Funktionsname "; wurde angegeben, wobei funktionsname eine implementation-defined ist Zeichenfolge Es ist nicht spezifiziert, ob eine solche Variable eine Adresse hat unterscheidet sich von jedem anderen Objekt im Programm.
Und was ist der Grund dafür? Geben Sie etwas wie "Unbekannt" zurück, wenn wir den aktuellen Funktionsnamen nicht erhalten können?
Was ist der "Name" einer Funktion in C ++?
Ein "implementierungsdefinierter String" gibt dem Compiler eine gewisse Flexibilität, wie er all diese Informationen in den String einfügt. Und es sendet Ihnen, dem Programmierer, eine Nachricht, dass Sie nicht versuchen sollten, Zeichenkettenvergleich oder Parsing durchzuführen oder tatsächlich irgendetwas zu tun, außer den Wert zu protokollieren, wenn Sie Portabilität wünschen.
(Sie können diese Werte nicht einmal miteinander vergleichen, da es keine Garantie gibt, dass sie eindeutig sind. Es ist möglich, dass alle Überladungen die gleiche Zeichenfolge ergeben. Daher ist es nicht ratsam, sie zur Kompilierung von Profiler-Statistiken zu verwenden.)
Weil C ++ das Überladen von Funktionen basierend auf dem Typ ihrer Parameter erlaubt und weil Funktionen in nicht-globalen Geltungsbereich platziert werden können (beides ist in Standard C nicht erlaubt), der einfache Name der lexikalisch umschließenden Funktion ist nicht ausreichend, um es zu identifizieren.
Betrachten Sie zum Beispiel:
%Vor%Was soll es drucken?
GCC erzeugt ein Programm, das "A" und "funca" druckt, aber der Standard erlaubt es, "A :: A" und "a :: funca" zu drucken, was der C-Standard nicht erlauben würde.
>