2016-12-23 10 views
4

Я заинтересован в печати полей структуры.Печать полей и значений структуры в C

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

Есть ли способ в языке «C», чтобы вывести содержимое структуры, что-то вроде

например: print (T_THREAD) и выход должен быть как

Contents of a structure T_THREAD are 
    thread_id 
    is_valid 
+2

ли вам хотите распечатать значения конкретного экземпляра или макета общей структуры? (Хотя ответ никоим образом, вы должны сделать это самостоятельно) – user45891

+0

Я хотел бы напечатать макет общей структуры. Если я добавлю еще несколько полей в структуру, тогда мой printf также сможет напечатать новый добавленный. – user3555115

ответ

2

Нет, там нет стандарт/предопределенный способ достижения того, чего вы хотите.

Да, однако, вы можете написать свою собственную функцию, которая имеет знание конкретных структуры значения элементов для печати, а затем, с помощью одного вызова функции с конкретным экземпляром переменной структуры , вы можете получить все значения всех членов, которые будут напечатаны. Что-то вроде

T_THREAD var; 

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

должно быть в состоянии напечатать значения.

Однако, обратите внимание, что это не позволяют печатать переменные имена ни в каких целях, только «ценности».

5

То, что вы ищете, является отражением. Java и другие виртуальные языки имеют отражение, поэтому вы можете распечатывать имена переменных и имена функций для любого данного класса. Поскольку компилятор автоматически создает эти функции отражения.

C не имеет отражения. Вы должны делать все вручную.

3

Что касается вашей структуры, функция будет выглядеть примерно так ..

// 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); 
} 
+0

'struct * st'? Это должно быть 'T_THREAD * st'. И если вы измените это, то очевидно, что 'st_name' не обязательно –

+0

благодарю вас @IngoLeonhardt за указание на это. – Hawk

0

Там нет никакого способа, вы можете напечатать все структурные элементы с одной printf заявления. В C вы должны распечатать их все вручную. Вот пример создания двух членов структуры и их печати:

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

Выход:

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

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

В качестве альтернативы, вы можете создать функцию, чтобы сделать это также:

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); 
} 
+0

Конечно, вы можете распечатать все это за один вызов printf:' printf ("\ nКонтакты структуры% s: \ nthread_id:% d \ nis_valid:% d \ n ", T-> name, T-> thread_id, T-> is_valid);' – gurka

+0

@gurka Конечно вы можете :) – RoadRunner

 Смежные вопросы

  • Нет связанных вопросов^_^