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