C语言 不同文件中枚举和数组的一致性检查



目前有两个开发人员正在编写两个单元。一个单元包含一个枚举定义(另外依赖于编译器开关),另一个单元使用数组定义来初始化数组。目前一切都在同步。如果枚举的定义随着时间的推移而更改,但数组没有更改,我们如何避免陷入麻烦。对编译时或运行时检查有什么想法吗?

阿比克·

typedef enum {
  A,
  #ifdef UseB
  B,
  #endif
  C,
  MAX
}My Enum

xyz.c

#include abc.h
int myArray[MAX] = {
  1,    // A
  #ifdef UseB
  2,    // B
  #endif
  3
};

如果在 C 之后添加了新元素 D 或顺序更改(例如 A 和 C 互换),是否有办法获得通知?

在宏中定义整个enum内容:

#ifdef UseB
#define B_Contents B,
#else
#define B_Contents 
#endif
#define MYENUM_CONTENT 
A, 
B_Contents 
C
typedef enum {
    MYENUM_CONTENT , 
    MAX
}

xyz.c:

#include abc.h
int myArray[MAX] = {
  MYENUM_CONTENT
};

您可以将它们放在同一个包含中,以便更新 1 提示更新另一个。 以下是musl libc的一个例子:

strerror.h

E(EILSEQ,       "Illegal byte sequence")
E(EDOM,         "Domain error")
E(ERANGE,       "Result not representable")
E(ENOTTY,       "Not a tty")
E(EACCES,       "Permission denied")
E(EPERM,        "Operation not permitted")
E(ENOENT,       "No such file or directory")
E(ESRCH,        "No such process")
E(EEXIST,       "File exists")
//....

strerror.c

#define E(a,b) ((unsigned char)a),
static const unsigned char errid[] = {
#include "__strerror.h"
};
#undef E
#define E(a,b) b ""
static const char errmsg[] =
#include "__strerror.h"

在枚举中手动赋值并使用枚举标签初始化数组:

typedef enum {
  A = 1,
  #ifdef UseB
  B = 2,
  #endif
  C = 3,
}My Enum
int myArray[MAX] = {
  A,
  #ifdef UseB
  B,
  #endif
  C
};

但是你必须有条件地定义MAX,这会失去让它成为enum一部分的优雅:

#ifdef UseB
#define MAX 3
#else
#define MAX 2
#endif

最新更新