it-swarm.com.de

Drucken Sie die Strukturfelder und Werte in C aus

Ich möchte die Strukturfelder ausdrucken.

Typedef struct
{
   UINT32 thread_id;
   BOOL   is_valid;
}T_THREAD;

Gibt es eine Möglichkeit, in der Sprache "C" den Inhalt einer Struktur zu drucken, so etwas wie

beispiel: print (T_THREAD) und Ausgabe sollten wie folgt sein

Contents of a structure T_THREAD are 
  thread_id
  is_valid
14
user3555115

Was Sie suchen, ist Reflexion. Java und andere virtuelle Sprachen haben Reflektion, sodass Sie die Variablennamen und Funktionsnamen für eine bestimmte Klasse ausdrucken können. Der Compiler erstellt diese Reflektionsfunktionen automatisch.

C hat keine Reflexion. Sie müssen alles manuell machen.

14

Was Ihre Struktur betrifft, würde die Funktion ungefähr so ​​aussehen.

// st_name is the name of the struct
void print(T_THREAD *st, const char *st_name)
{
    printf("Contents of structure %s are %lu, %d\n", st_name, st->thread_id, st->is_valid);
}
5
Hawk

Nein, Es gibt keinen Standard/vordefinierten Weg, um das zu erreichen, was Sie wollen.

Ja, Sie können jedoch eine eigene Funktion schreiben, die Kenntnisse über die speziellen zu druckenden Strukturelementwerte besitzt, und Mit einem einzigen Aufruf der Funktion mit einer bestimmten Instanz der Strukturvariablen können Sie dann alle Werte aller Elemente abrufen, die gedruckt werden. So etwas wie

T_THREAD var;

my_print(var);  //my_print() is the function you'll roll out

sollte in der Lage sein, die Werte zu drucken.

Beachten Sie jedoch, dass Sie mit diesem nicht die Variablennamen auf beliebige Weise drucken können, nur "Werte".

5
Sourav Ghosh

Es gibt keine Möglichkeit, alle Strukturelemente mit einer einzigen printf -Anweisung zu drucken. In C müssen Sie sie alle manuell ausdrucken. Hier ist ein Beispiel, wie zwei Strukturelemente erstellt und ausgedruckt werden:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct {
    char *name;
    int thread_id;
    bool is_valid;
}T_THREAD;

int
main(void) {
    T_THREAD T1 = {"T1", 123, 1};
    T_THREAD T2 = {"T2", 456, 0};

    printf("\nContents of a structure %s are:\n", T1.name);
    printf("thread_id: %d\n",T1.thread_id);
    printf("is_valid: %d\n", T1.is_valid);

    printf("\nContents of a structure %s are:\n", T2.name);
    printf("thread_id: %d\n",T2.thread_id);
    printf("is_valid: %d\n", T2.is_valid);

    return 0;
}

Ausgabe:

Contents of a structure T1 are:
thread_id: 123
is_valid: 1

Contents of a structure T2 are:
thread_id: 456
is_valid: 0

Alternativ können Sie auch eine Funktion erstellen, um dies zu tun:

int
main(void) {
    T_THREAD T1 = {"T1", 123, 1};
    T_THREAD T2 = {"T2", 456, 0};

    print_struct_elements(&T1);
    print_struct_elements(&T2);

    return 0;
}

void
print_struct_elements(T_THREAD *T) {
    printf("\nContents of a structure %s are:\n", T->name);
    printf("thread_id: %d\n",T->thread_id);
    printf("is_valid: %d\n", T->is_valid);
}
3
RoadRunner