Ich möchte eine log.c-Datei mit den Funktionen info(), debug() und error() erstellen. Diese Funktionen arbeiten ohne Druck von Dateinamen, Zeilennummer usw. Wenn ich also eine dieser Funktionen aufrufe, möchte ich den Dateinamen, die Zeilennummer und den Funktionsnamen des Aufrufers ausgeben. Wie können wir also genau zurückverfolgen? Gibt es eine Möglichkeit, auf C zurückzuverfolgen, oder, wenn wir Makros verwenden, wie kann dies bewerkstelligt werden?
Druckt den Dateinamen, die Zeilennummer und den Funktionsnamen einer aufrufenden Funktion – C Prog
sur2k
Ich würde die Daten über Parameter an die Funktion übergeben (vielleicht die Hilfe eines Makros holen)
int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
Und sie anzurufen
info(__FILE__, __LINE__, __func__, ...);
debug(__FILE__, __LINE__, __func__, ...);
error(__FILE__, __LINE__, __func__, ...);
Notiz: __func__
ist C99; gcc, im Modus C89 hat __FUNCTION__
-
Gibt es eine Möglichkeit, diese Art von Funktionen zu erstellen, ohne zu übergeben DATEI,..etc Parameter die ganze Zeit?
– sur2k
17. Januar 2012 um 11:10 Uhr
-
Ja, mit einem Makro. Zum Beispiel für C99 (das verschiedene Makros hat):
#define INFO(...) info(__FILE__, __LINE__, __func__, __VA_ARGS__)
– pmg
17. Januar 2012 um 11:20 Uhr
-
Vielen Dank! Das habe ich gebraucht.
– sur2k
17. Januar 2012 um 11:37 Uhr
-
ich verwende dieselbe Funktion #define INFO(…) info(DATEI, LINIE, Funk, VA_ARGS) in cpp, aber es gibt mir Fehler, wenn ich dieselbe Header-Datei aus verschiedenen Klassen einfüge? Wissen Sie, wie ich dasselbe in C++ implementieren kann.
– SurabhKus
21. Dezember 2016 um 8:22 Uhr
Michael
Wenn Sie Makros verwenden, können Sie dies meiner Meinung nach mithilfe von tun __FILE__
, __LINE__
und __FUNCTION__
. Zum Beispiel,
#define INFO(msg) \
fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \
fprintf(stderr, "%s", msg);
Sie könnten auch Funktionen verwenden, aber Sie müssten übergeben __FILE__
usw., um sicherzustellen, dass sie den richtigen Wert haben.
-
gcc -std=gnu99
sagt__LINE__
ist eine Ganzzahl und warnt vor dem Castingchar *
. Sollte die zweite Zeile nicht seinfprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \
(%s
ersetzt durch%d
)?– matec
13. Februar 2014 um 18:15 Uhr
-
Fest! Da gibt es ein paar Old-School-Python.
– Michael
13. Februar 2014 um 21:05 Uhr
stackoverflow.com/questions/2651850/…
– kennytm
16. Januar 2012 um 18:11 Uhr
mögliches Duplikat der C/C++-Zeilennummer
– Benutzer7116
16. Januar 2012 um 18:17 Uhr
@KennyTM: Danke! Antwort ist da.
– sur2k
17. Januar 2012 um 11:38 Uhr