c - 声明结构和结构大小相关的数组

标签 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
};

问题是:如果我需要向结构 type_x_t 添加一个数据(如 d),我需要将它的 uid 添加到所有其他三个数组中。

很难维护代码。

所以我想知道是否可以将四个地方的所有这些数据维护到一张表中?

我可以将三个 uint32 数组放入一个二维数组中

uint32_t uid[system_id][value];

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

我想知道我是否可以继续前进?因此我可以维护一张表来管理所有这些数据。比如

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

试图用宏来解决问题,但我无法通过__VA_ARGS__访问某些位置的数据。

最佳答案

首先,如果您将代码相邻地放在一个文件中,您实际上是在维护一个地方而不是几个地方。你拥有的不一定是坏的。无论如何...

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

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

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

在所有程序设计选项都已用尽的情况下,然后 - 并且只有在那时 - 您可以考虑使用宏。您正在钓鱼的是所谓的“X 宏”,这是最后的手段,并不真正推荐,因为它们会使代码更难阅读。 X宏的目的是将数据的代码维护集中到一个地方。它是这样的:

#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
};

现在您只需在需要更改数据时更改“TYPE_X_LIST”即可。如果你想跟踪你有多少数据集,你可以添加一个枚举来计算它们:

typedef enum
{
  #define X(name, ...) something_##name,
  TYPE_X_LIST
  #undef X
  TYPE_X_N  // the number of data sets
} type_x_size_t;

然后 TYPE_X_N 可用于设置数组大小等。

关于c - 声明结构和结构大小相关的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43579580/

相关文章:

c - 符号无法解析 eclipse CDT

c++ - 如何将图像缓冲区传递给 OpenCV Mat 对象?

json - 如何在结构中定义多个名称标签

c - 如何使用 Win32 API 来像控制台一样使用 RichEdit 控件?

c - 负数的模运算

javascript - 冒泡排序 - 为什么需要额外的循环

python - 在 Python 中构建二维数组

javascript - 修改 JavaScript 数组属性

C 链表集(抽象数据类型)

c malloc 结构数组