__func__ Wertunterschied zwischen C und C ++

8

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?

    
FrozenHeart 04.01.2013, 20:08
quelle

3 Antworten

14

Was ist der "Name" einer Funktion in C ++?

  • Ist es durch seinen Namensraum qualifiziert?
  • Sind überladene Funktionen nach ihren Parametertypen benannt?
  • Was ist mit Rückgabetyp, der nicht zum Überladen verwendet wird?
  • Was passiert in Funktionsvorlagen?
  • Nennt Convention Teil des Namens?
  • Sollen 'const' und 'volatile' vor oder nach dem Typnamen geschrieben werden?

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.)

    
Ben Voigt 04.01.2013, 20:14
quelle
4

Ich vermute, dass dies dem C ++ - Compiler erlaubt, den entstellten Namen in __func__ zu verwenden.

    
NPE 04.01.2013 20:14
quelle
3

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.

>     
greyfade 04.01.2013 20:18
quelle

Tags und Links