循环遍历 C 结构中的元素,用于提取单个元素的值和数据类型



我有一个要求,我在 C 中有一个大结构,由大约 30 多个不同数据类型的不同元素组成:

typedef struct {
type1 element1;
type2 element2;
type3 element3;
type2 element4[10];
...
typeN elementN;
} my_messg_struct;

这基本上是通过串行协议发送的消息中的一组元素。此消息具有上述结构中捕获的不同数据类型的各种元素。同样,我也有很多其他信息。现在我必须编写一个泛型函数,它负责读取这些消息结构,并遍历每个元素,读取元素的值和数据类型,然后通过串行端口传输。我需要先读取数据类型,因为在我的情况下,各种数据类型的传输顺序是不同的。

所以,基本上,我只是想知道如何在 C 中循环访问结构的元素,以便我可以读取结构中存在的每个元素的值和数据类型?

您可以尝试使用 X 宏,但生成的源代码可读性值得怀疑:

#include <stdio.h>
#define LIST_OF_VARIABLES 
XI(int, value1) 
XD(double, value2) 
XU(unsigned, value3)

#define XI(int, name) int name;
#define XD(double, name) double name;
#define XU(unsigned, name) unsigned name;
typedef struct A {
LIST_OF_VARIABLES
} A;
#undef XI
#undef XD
#undef XU
void print_variables(struct A a)
{
#define XI(type, name) printf("%s = %dn", #type, a.name);
#define XD(type, name) printf("%s = %fn", #type, a.name);
#define XU(type, name) printf("%s = %un", #type, a.name);
LIST_OF_VARIABLES
#undef XI
#undef XD
#undef XU
}
int main(void) {
A a = {
.value1 = 10,
.value2 = 0.5,
.value3 = 1,
};
print_variables(a);
return 0;
}

现在,您已经为每个#type放置了一个类型字符串,您可以使用一些字符串比较函数来确定每种类型的基础。

C不支持在结构成员上旅行(类似于 C#、Java 中的反射(。您需要用一个结构包装每个元素,说明其大小、类型和数据。像这样:

typedef enum {
et_int,
et_long,
et_string,
et_array
}element_type_t;
struct element {
element_type_t type;
int element_length;
void *data;
};

顺便说一句,如果有一种方法可以获取结构的反射,如果一个人正在使用谷歌协议缓冲区。(见 https://en.wikipedia.org/wiki/Protocol_Buffers(这样,您可以询问每个结构具有哪些成员以及哪种类型。但是,使用此功能涉及使用协议缓冲区编译器并将协议缓冲区文件添加到项目中。

最新更新