web-dev-qa-db-fra.com

Imprimer les champs et les valeurs de la structure en C

Je suis intéressé par l'impression des champs de structure.

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

Est-il possible d’utiliser le langage "C" pour imprimer le contenu d’une structure, par exemple

ex: print (T_THREAD) et la sortie devrait être comme

Contents of a structure T_THREAD are 
  thread_id
  is_valid
14
user3555115

Ce que vous recherchez, c'est une réflexion. Java et d'autres langages virtuels ont une réflexion), vous pouvez donc imprimer les noms de variable et les noms de fonction de toute classe donnée. En effet, le compilateur crée ces fonctions de réflexion automatiquement.

C n'a pas de reflet. Vous devez tout faire manuellement.

14
Sanchke Dellowar

Quant à votre structure, la fonction ressemblerait à quelque chose comme ça.

// 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

Non, il n'y a pas standard/prédéfini moyen d'obtenir ce que vous voulez.

Oui, cependant, vous pouvez écrire votre propre fonction, qui connaît les valeurs d'élément de la structure à imprimer, et ensuite, avec un seul appel à la fonction avec une instance particulière de la variable de structure, vous pouvez obtenir que toutes les valeurs de tous les membres soient imprimées. Quelque chose comme

T_THREAD var;

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

devrait pouvoir imprimer les valeurs.

Toutefois, veuillez noter que ceci ne le fait pas vous permet d’imprimer les noms de variable de quelque manière que ce soit, mais uniquement des "valeurs".

5
Sourav Ghosh

Vous ne pouvez pas imprimer tous les éléments de structure avec une seule instruction printf. En C, vous devez tous les imprimer manuellement. Voici un exemple de création et d’impression de deux membres de structure:

#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;
}

Sortie:

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

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

Alternativement, vous pouvez créer une fonction pour faire ceci aussi:

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