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

我有一个要求,我在C中有一个很大的结构,包含30多种不同数据类型的不同元素:

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

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

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

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

  #include  #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 = %d\n", #type, a.name); #define XD(type, name) printf("%s = %f\n", #type, a.name); #define XU(type, name) printf("%s = %u\n", #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不支持在struct成员上旅行(类似于C#,Java的reflection)。 你需要用一个结构来包装每个元素,说明它的大小,类型和数据。 像这样的东西:

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

顺便说一句,如果使用谷歌协议缓冲区,有一种方法可以获得结构的reflection。 (请参阅https://en.wikipedia.org/wiki/Protocol_Buffers )这样您就可以询问每个结构有哪些成员以及哪种类型。 然而,使用它,涉及使用协议缓冲区编译器和添加协议缓冲区文件到您的项目。