Drucken Sie eine Struktur in C

Lesezeit: 2 Minuten

Ich versuche, a zu drucken struct das kommt als Argument in einer Funktion, um etwas zu debuggen.

Kann ich den Inhalt einer Struktur trotzdem drucken, ohne zu wissen, wie er aussieht, dh ohne jedes Feld explizit zu drucken? Sie sehen, je nach Menge unterschiedlich #defineDa die Struktur sehr unterschiedlich aussehen kann, dh unterschiedliche Felder haben oder nicht haben kann, würde ich gerne einen einfachen Weg finden, so etwas zu tun print_structure(my_structure).

Der Debugger von NetBeans kann das für mich tun, aber leider läuft der Code auf einem Gerät, auf dem ich keinen Debugger ausführen kann.

Irgendwelche Ideen? Ich nehme an, es ist nicht möglich, aber zumindest gibt es möglicherweise ein Makro, um dies zur Kompilierzeit zu tun, oder so?

Vielen Dank!

  • Dies ist jetzt im Clang-Compiler möglich. Siehe meine Antwort auf eine ähnliche Frage. (Ich bin mir nicht sicher, ob die SO-Etikette hier eine doppelte Antwort posten oder auf die andere verlinken soll.)

    – Jonathan Fürth

    18. November 2019 um 1:03 Uhr

Benutzer-Avatar
Fred Fu

Sie können jederzeit einen Hex-Dump der Struktur erstellen:

#define PRINT_OPAQUE_STRUCT(p)  print_mem((p), sizeof(*(p)))

void print_mem(void const *vp, size_t n)
{
    unsigned char const *p = vp;
    for (size_t i=0; i<n; i++)
        printf("%02x\n", p[i]);
    putchar('\n');
};

  • Dieser Code zeigt auch den Inhalt der Füllbytes an. Sie können beliebige Werte enthalten und sich an beliebiger Stelle innerhalb der Struktur befinden.

    – Ludin

    18. März 2011 um 9:13 Uhr

  • @Lundin: das stimmt. Aber mit einigen Kenntnissen des Compilers kann dies dennoch nützliche Informationen enthalten. Man müsste wissen, wo man suchen muss.

    – Fred Foo

    18. März 2011 um 9:14 Uhr

  • @ young001: Das liegt daran, dass es in C geschrieben ist. In C ++ benötigen Sie eine explizite Umwandlung unsigned char const *.

    – Fred Foo

    8. Juni 2013 um 19:16 Uhr

  • etwas besser, mit Gruppierung und Zeilenumbruch: printf("%02x%s", p[i], i==0 ? "" : i % 16 == 15 ? "\n" : i % 4 == 3 ? " " : "");

    – sehari24jam

    10. September 2015 um 6:30 Uhr

  • Ich bin nicht einverstanden mit der Vorstellung, dass es “besser” ist, mehrere ternäre Operatoren in einen Parameter zu stopfen.

    – 3Dave

    29. November 2016 um 14:41 Uhr

Benutzer-Avatar
pma_

Es gibt nichts Vergleichbares zu RTTI in C, die einzige Lösung (abgesehen von Hex-Dump wie oben) besteht darin, die Dump-Funktion zusammen mit anderen #defines zu definieren, dh.

#if _DEBUG

struct { ..... }
#define STRUCT_DUMP(x) printf(.....)

#else

struct { ..... } // other version
#define STRUCT_DUMP(x) printf(.....)    // other version dump

#endif

1297640cookie-checkDrucken Sie eine Struktur in C

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

Privacy policy