首页 > 解决方案 > 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

问题描述

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

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

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

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

标签: cstruct

解决方案


您可以尝试使用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 = %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出现时都放置了一个类型字符串,您可以使用一些字符串比较函数来确定每种类型的基础。


推荐阅读