web-dev-qa-db-ja.com

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
_
14
user3555115

あなたが探しているのは反射です。 Javaおよび他の仮想言語にはリフレクションがあり、特定のクラスの変数名と関数名を出力できます。コンパイラはこれらのリフレクション関数を自動的に構築するためです。

Cには反射がありません。すべてを手動で行う必要があります。

14

構造に関しては、関数は次のようになります。

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

いいえ、あなたが望むものを達成する方法はありません標準/事前定義された方法。

はい、ただし、特定の構造要素の値についての知識を持つ独自の関数を記述できます。次に、構造体変数の特定のインスタンスを使用して関数を1回呼び出すだけで、すべてのメンバーのすべての値を出力できます。何かのようなもの

T_THREAD var;

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

値を出力できるはずです。

ただし、このしないを使用すると、変数namesを「値」のみで印刷できます。

5
Sourav Ghosh

単一のprintfステートメントですべての構造要素を印刷する方法はありません。 Cでは、それらをすべて手動で印刷する必要があります。次に、2つの構造体メンバーを作成して印刷する例を示します。

#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);
}
3
RoadRunner