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
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?
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.
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.
__FUNCTION__
ist kein Standard. Verwende __func__
. Wie die Dokumentation sagt, ist es so, als ob:
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__);
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.
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%Tags und Links string c++ compiler-construction g++ c-preprocessor