我对打印结构字段很感兴趣。
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
我对打印结构字段很感兴趣。
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
// 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);
}
struct *st
应该改为 T_THREAD *st
。如果你做出这个改变,那么显然 st_name
就不再必要了。 - Ingo Leonhardt不行,没有现成的标准方法可以实现你想要的。
但是,你可以编写自己的函数,该函数了解要打印的特定结构元素值,然后通过单个对该函数的调用,使用特定结构变量的实例即可打印出所有成员的所有值。类似这样:
T_THREAD var;
my_print(var); //my_print() is the function you'll roll out
应该能够打印出值。
但请注意,这并不允许您以任何方式打印变量名称,只能打印“值”。
使用单个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);
}
printf("\n结构体%s的内容为:\n线程ID:%d\n是否有效:%d\n", T->name, T->thread_id, T->is_valid);
- simon78 typedef struct
79 {
80 int thread_id;
81 int is_valid;
82 }T_THREAD;
83
84 T_THREAD tThread = { 0 } ;
gdb -o test -g test.c
gdb test
(gdb) break 85
(gdb) run
(gdb) p tThread
$1 = {thread_id = 0, is_valid = 0}
有很多关于GDB的在线教程。 这里有一个可以帮助你入门的教程。 https://condor.depaul.edu/glancast/373class/docs/gdb.html
#include <stdio.h>
#include <stdint.h>
#define HDR_STRUCT_FIELDS \
FLD(0, Field_1, uint32_t, 3) \
FLD(1, Field_2, uint16_t, 4) \
FLD(2, Field_3, uint8_t, 5)
#define FLD(idx, fld, dt, initVal) dt fld;
typedef struct
{
HDR_STRUCT_FIELDS
} HdrData_t;
#undef FLD
#define FLD(idx, fld, dt, initVal) .fld = initVal,
HdrData_t HeaderData =
{
HDR_STRUCT_FIELDS
};
#undef FLD
#define QUOTE(field) #field
#define FLD(idx, fld, dt, initVal) [idx] = QUOTE(fld),
const char* HeaderDataName[] =
{
HDR_STRUCT_FIELDS
};
#undef FLD
int main()
{
#define FLD(idx, fld, dt, initVal) printf("%s = %d\n", HeaderDataName[idx], HeaderData.fld);
HDR_STRUCT_FIELDS
#undef FLD
return (0);
}
#include <stdio.h>
#include <stdint.h>
#define HDR_STRUCT_FIELDS \
FLD(Field_1, uint32_t, 3) \
FLD(Field_2, uint16_t, 4) \
FLD(Field_3, uint8_t, 5)
#define FLD(fld, dt, initVal) dt fld;
typedef struct
{
HDR_STRUCT_FIELDS
} HdrData_t;
#undef FLD
#define FLD(fld, dt, initVal) .fld = initVal,
HdrData_t HeaderData =
{
HDR_STRUCT_FIELDS
};
#undef FLD
#define FLD(fld, dt, initVal) const char *fld;
typedef struct
{
HDR_STRUCT_FIELDS
} HdrDataFldString_t;
#undef FLD
#define STRINGIZE(field) #field
#define FLD(fld, dt, initVal) .fld = STRINGIZE(fld),
HdrDataFldString_t HdrDataFldString =
{
HDR_STRUCT_FIELDS
};
#undef FLD
int main()
{
#define FLD(fld, dt, initVal) printf("%s = %d\n", HdrDataFldString.fld, HeaderData.fld);
HDR_STRUCT_FIELDS
#undef FLD
return (0);
}