Vorausgesetzt , dass Ihre C ++ Compiler unterstützt sie, gibt es einen bestimmten Grund , nicht zu verwenden __FILE__
, __LINE__
und __FUNCTION__
für die Protokollierung und Debugging - Zwecke?
Es geht mir in erster Linie darum, dem Benutzer irreführende Daten zu geben - beispielsweise die falsche Zeilennummer oder Funktion als Ergebnis der Optimierung zu melden - oder einen Leistungseinbruch zu erzielen.
Grundsätzlich kann ich vertrauen __FILE__
, __LINE__
und __FUNCTION__
zu immer das Richtige zu tun?
c++
debugging
logging
c-preprocessor
Runcible
quelle
quelle
Antworten:
__FUNCTION__
ist nicht Standard,__func__
existiert in C99 / C ++ 11. Die anderen (__LINE__
und__FILE__
) sind in Ordnung.Es wird immer die richtige Datei und Zeile gemeldet (und die Funktion, wenn Sie
__FUNCTION__
/ verwenden möchten__func__
). Die Optimierung spielt keine Rolle, da es sich um eine Makroerweiterung zur Kompilierungszeit handelt. Es wird niemals die Leistung in irgendeiner Weise beeinträchtigen.quelle
__func__
ist eine Art Problem in C ++. C99 sagt kein Wort über Standardargumente usw. Fälle, in denen es nicht so offensichtlich ist, wie__func__
sich C ++ verhalten soll.__func__
es in c99 existiert, nicht in c ++. Unabhängig davon denke ich, dass eine vernünftige Implementierung von__func__
in c ++ nur zu dem verstümmelten Namen führen würde. Da ich kein Compiler-Autor bin, ist es nicht wirklich mein Aufruf.__FUNCTION__
überhaupt nicht? Welche Compiler außer gcc behandeln dies als Variable und nicht als Makro?__func__
ist jetzt in C ++ 11 Standard.In seltenen Fällen kann es nützlich sein, die von
__LINE__
etwas gegebene Zeile zu ändern . Ich habe gesehen, dass GNU configure dies für einige Tests tut, um entsprechende Zeilennummern zu melden, nachdem zwischen Zeilen, die nicht in Originalquelldateien enthalten sind, Voodoo eingefügt wurde. Beispielsweise:Die folgenden Zeilen beginnen mit
__LINE__
100. Sie können optional einen neuen Dateinamen hinzufügenEs ist nur selten nützlich. Aber wenn es gebraucht wird, gibt es keine Alternativen, die ich kenne. Anstelle der Zeile kann auch ein Makro verwendet werden, das zu einer der beiden oben genannten Formen führen muss. Mit der Boost-Präprozessor-Bibliothek können Sie die aktuelle Zeile um 50 erhöhen:
Ich fand es nützlich, es zu erwähnen, da Sie nach der Verwendung von
__LINE__
und gefragt haben__FILE__
. Man bekommt nie genug Überraschungen aus C ++ :)Edit: @Jonathan Leffler bietet einige weitere gute Anwendungsfälle in den Kommentaren:
quelle
Zu Ihrer Information: g ++ bietet das nicht standardmäßige Makro __PRETTY_FUNCTION__ an. Bis jetzt wusste ich nichts über C99 __func__ (danke Evan!). Ich glaube, ich bevorzuge immer noch __PRETTY_FUNCTION__, wenn es für das zusätzliche Klassen-Scoping verfügbar ist.
PS:
quelle
Persönlich zögere ich, diese für etwas anderes als das Debuggen von Nachrichten zu verwenden. Ich habe es getan, aber ich versuche, Kunden oder Endbenutzern diese Art von Informationen nicht zu zeigen. Meine Kunden sind keine Ingenieure und manchmal nicht mit Computern vertraut. Ich könnte diese Informationen in der Konsole protokollieren, aber wie gesagt nur ungern, außer bei Debug-Builds oder internen Tools. Ich nehme an, es hängt jedoch von Ihrem Kundenstamm ab.
quelle
C ++ 20
std::source_location
C ++ hat endlich eine Nicht-Makro-Option hinzugefügt, die wahrscheinlich irgendwann in der Zukunft dominieren wird, wenn C ++ 20 weit verbreitet wird:
Die Dokumentation sagt:
Dabei bedeutet NTBS "Null Terminated Byte String".
Ich werde es versuchen, wenn der Support bei GCC eintrifft. GCC 9.1.0
g++-9 -std=c++2a
unterstützt ihn immer noch nicht.https://en.cppreference.com/w/cpp/utility/source_location Die Nutzung von Ansprüchen lautet wie folgt:
Mögliche Ausgabe:
__PRETTY_FUNCTION__
vs__FUNCTION__
vs__func__
vsstd::source_location::function_name
Beantwortet bei: Was ist der Unterschied zwischen __PRETTY_FUNCTION__, __FUNCTION__, __func__?
quelle
<experimental/source_location>
im aktuellen gcc-9.Ich benutze sie die ganze Zeit. Das einzige, worüber ich mir Sorgen mache, ist, IP in Protokolldateien preiszugeben. Wenn Ihre Funktionsnamen wirklich gut sind, können Sie möglicherweise ein Geschäftsgeheimnis leichter aufdecken. Es ist wie beim Versand mit Debug-Symbolen, nur schwieriger zu finden. In 99,999% der Fälle wird nichts Schlimmes daraus.
quelle
strings
Dienstprogramm zu extrahieren, um alle stringähnlichen Daten aus der ausführbaren Datei zu extrahieren. Sogar komprimierte ausführbare Dateien können extrahiert werden. Achten Sie sehr darauf, was Sie an einen Kunden senden. Oft können Konkurrenten Ihre ausführbaren Dateien in die Hände bekommen, obwohl sie dies nicht tun sollen.