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