Druckt den Dateinamen, die Zeilennummer und den Funktionsnamen einer aufrufenden Funktion – C Prog

Lesezeit: 2 Minuten

Benutzer-Avatar
sur2k

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?

  • 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

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

Benutzer-Avatar
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 Casting char *. Sollte die zweite Zeile nicht sein fprintf(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

1365120cookie-checkDruckt den Dateinamen, die Zeilennummer und den Funktionsnamen einer aufrufenden Funktion – C Prog

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy