声明struct和struct-size相关的数组

时间:2017-04-24 04:00:17

标签: c arrays struct

我的工作条件是这样的:

typedef struct __type_x{
   sub_type_a  a;
   sub_type_b  b;
   sub_type_c  c;
}type_x_t;

uint32_t type_x_uids[] = {
   1, //a's_uid
   2, //b's_uid
   3, //c's_uid
};

uint32_t type_x_uid_another[] = {
   3, //a's uid in another API system
   1, //b's uid in another API system
   2, //c's uid in another API system
};

uint32_t type_x_uids_one_more[] = {
   1, //a's_uid in yet another system
   3, //b's_uid in yet another system
   2, //c's_uid in yet another system
};

问题是:如果我需要在struct type_x_t中再添加一个数据(如d),我需要将其uid添加到所有其他三个数组中。

很难维护代码。

所以我想知道是否可以将所有这些数据从四个地方保存到一个表中?

我可以将三个uint32数组放入一个2D数组

uint32_t uid[system_id][value];

但我还必须维护两段代码而不是一段代码。

我想知道无论如何我还能前进吗?因此,我可以维护一个表来管理所有这些数据。如此

{#data_type, #data_name, #uid_1, #uid2, #uid 3},

尝试使用宏来解决问题,但我无法通过__VA_ARGS__访问特定位置的数据。

1 个答案:

答案 0 :(得分:1)

首先,如果您将代码相邻地放在一个文件中,那么实际上是在一个地方而不是几个地方。你所拥有的并不一定是坏事。总之...

我将假设beforeEach是结构而不是数组的原因。那么最好的设计就是添加" uid"为" a"到type_x_t结构,或者创建一个包含两者的新结构,因为这些数据属于一起。

如果这不是一个选项,你可以使用数组,然后将其放在sub_type_a结构中。

如果这也不是一个选项,请考虑一些完全不同的程序设计。

所有程序设计选项都耗尽,然后 - 只有这样 - 你可以考虑使用宏。您正在捕获的是所谓的" X宏",这是最后的手段,并不是真正推荐的,因为它们使代码更难以阅读。 X宏的目的是将数据的代码维护集中到一个地方。它是这样的:

type_x_t

现在你只需要改变" TYPE_X_LIST"何时需要更改数据。如果要跟踪您拥有的数据集,可以添加枚举来计算它们:

#include <stdint.h>

#define TYPE_X_LIST \
  X(a,1,3,1)        \
  X(b,2,1,3)        \
  X(c,3,2,2)

typedef struct
{
  #define X(name, dummmy1, dummy2, dummy3) sub_type_##name name;
  TYPE_X_LIST
  #undef X
} type_x_t;

uint32_t type_x_uids[] = {
  #define X(dummy1, id, dummy2, dummy3) id,
  TYPE_X_LIST
  #undef X
};

uint32_t type_x_uid_another[] = {
  #define X(dummy1, dummy2, id, dummy3) id,
  TYPE_X_LIST
  #undef X
};

uint32_t type_x_uids_one_more[] = {
  #define X(dummy1, dummy2, dummy3, id) id,
  TYPE_X_LIST
  #undef X
};

然后typedef enum { #define X(name, ...) something_##name, TYPE_X_LIST #undef X TYPE_X_N // the number of data sets } type_x_size_t; 可用于设置数组大小等。