g ++ __FUNCTION__ Zeit ersetzen

8

Kann jemand sagen, wenn g ++ das __FUNCTION__ 'Makro' durch den String ersetzt, der den Funktionsnamen enthält? Es scheint, dass es es nicht ersetzen kann, bis es die syntaktische Korrektheit des Quellcodes überprüft hat, d. H. Das Folgende funktioniert nicht

%Vor%

seit der Vorverarbeitung mit

%Vor%

Die Quelle sieht wie

aus %Vor%

und jetzt wirft der Compiler richtig auf, weil die * ed-Zeile falsch ist.

Gibt es eine Möglichkeit, diese Ersetzung mit einer Zeichenfolge zu einem früheren Schritt zu erzwingen, damit die Zeile korrekt ist?

Wird __FUNCTION__ wirklich durch einen String ersetzt? Oder ist es eine Variable im kompilierten Code?

    
bbb 09.07.2010, 14:28
quelle

7 Antworten

15
  

Gibt es eine Möglichkeit, diese Ersetzung mit einer Zeichenfolge zu einem früheren Schritt zu erzwingen, damit die Zeile korrekt ist?

Nein. __FUNCTION__ (und sein standardisiertes Gegenstück, __func__ ) sind Compiler Konstrukte. __FILE__ und __LINE__ andererseits sind Präprozessor Konstrukte. Es gibt keine Möglichkeit, __FUNCTION__ zu einem Präprozessor-Konstrukt zu machen, da der Präprozessor keine Kenntnis von der C ++ - Sprache hat. Wenn eine Quelldatei vorverarbeitet wird, hat der Präprozessor absolut keine Vorstellung davon, welche Funktion er betrachtet, weil er nicht einmal ein Konzept von Funktionen hat.

Andererseits weiß der Präprozessor , an welcher Datei er arbeitet, und er weiß auch, in welcher Zeile der Datei er sich befindet, also kann er __FILE__ und __LINE__ .

Dies ist der Grund, warum __func__ als äquivalent zu einer statischen lokalen Variablen (d. h. einem Compiler Konstrukt) definiert ist; Nur der Compiler kann diese Funktionalität bereitstellen.

    
Dan Moulding 09.07.2010, 15:34
quelle
3

Sie verwenden __FUNCTION__ wie ein Präprozessor-Makro, aber es ist eine Variable (lesen Sie Ссылка ).

Versuchen Sie printf("%s", __FUNCTION__) nur zum Testen und es wird der Funktionsname gedruckt.

    
rogerzanoni 09.07.2010 15:04
quelle
2

__FUNCTION__ ist kein Standard. Verwende __func__ . Wie die Dokumentation sagt, ist es so, als ob:

%Vor%     
Nikolai Fetissov 09.07.2010 15:13
quelle
2

In C / C ++ verwandelt der Präprozessor "my " "name " "is " "Bob" in das String-Literal "my name is Bob" ; Da __FILE__ und __LINE__ Präprozessorbefehle sind, übergibt "We are on line " __LINE__ "Wir sind in Zeile 27" an den Compiler.

__FUNCTION__ ist normalerweise ein Synonym für __func__ . __func__ kann als eine Pseudofunktion betrachtet werden, die den Namen der Funktion zurückgibt, in der sie aufgerufen wurde. Dies kann nur vom Compiler und nicht vom Präprozessor durchgeführt werden. Da __func__ nicht vom Präprozessor ausgewertet wird, erhalten Sie keine automatische Verkettung. Wenn Sie also printf verwenden, muss dies von printf("the function name is %s", __func__);

erledigt werden     
doron 09.07.2010 15:30
quelle
1

Ist das was du willst?

%Vor%

Hinweis: Da Sie dies als C ++ markiert haben, sollten Sie wahrscheinlich die iostreams verwenden, um sicherzustellen, dass es typsicher ist.

    
Martin York 09.07.2010 18:25
quelle
0
%Vor%

Ja, ich weiß, das ist nicht wirklich dasselbe.

    
BCS 10.07.2010 01:43
quelle
0

Beachten Sie, dass Sie beim Erstellen einer Klasse eine Nachricht aus beliebig vielen Typen erstellen können, was bedeutet, dass Sie einen ähnlichen Effekt wie die & lt; & lt; Operator oder das Format in einem Printf (3C). Etwas wie das:

%Vor%

Beachten Sie, dass Sie das & lt; & lt; Operatoren anstelle von (). In diesem Fall wäre die resultierende Verwendung in etwa so:

%Vor%

Hängt davon ab, welche du bevorzugst. Ich mag Art (), weil es deine Ausdrücke automatisch schützt. Wenn Sie z. B. "count & lt; & lt; 3" ausgeben möchten, müssen Sie Folgendes schreiben:

%Vor%     
Alexis Wilke 02.02.2013 04:53
quelle