对不同文件中的枚举和数组进行一致性检查

时间:2014-11-20 09:48:26

标签: c arrays enums

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

abc.h

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互换),是否有办法获得通知?

3 个答案:

答案 0 :(得分:3)

在宏中定义整个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 :(得分:0)

您可以将它们放在同一个include中,以便更新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 "\0"
static const char errmsg[] =
#include "__strerror.h"

答案 2 :(得分:-1)

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

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