我目前有一个系统,我有一个枚举和一个将枚举值保存为字符串的数组。枚举和数组是通过宏生成的,枚举的实际值除了编号外还要编码3位信息。
myEnum_def.h
// args can be be -3 <= args <= 3
// so depending on the input value it is encoded as |29 enum entry bits|arg sign bit|2 arg value bits|
#define ENCODE_ARG(args) (((((args) & ((unsigned int)-1)) >> ((sizeof(unsigned int) * 8) - 1)) * (1 << 2)) | (3 & args))
#define MAKE_ENUM_VALUE(name, args) name = ((__COUNTER__ << 3) | MAKE_BYTECODE_ARGS(args))
#define MAKE_TEXT(name) #name
#define MAKE_NAME(name, args) MAKE_TEXT(name)
#define MY_ENUM_DEFINITIONS(M) \
M(myValue1, -2), \
M(myValue2, 2), \
...
M(myValueN, 1)
myEnum_undef.h
#undef MY_ENUM_DEFINITIONS
#undef MAKE_NAME
#undef MAKE_TEXT
#undef MAKE_ENUM_VALUE
#undef ENCODE_ARG
myEnum.h
#ifndef MYENUM_H
#define MYENUM_H
#include "myEnum_def.h"
enum myEnum {
MY_ENUM_DEFINITIONS(MAKE_ENUM_VALUE),
MY_ENUM_COUNT = __COUNTER__,
}
extern const char * myEnum_names[];
#include "myEnum_undef.h"
#endif
myEnum.c
#include "myEnum.h"
#include "myEnum_def.h"
const char * myEnum_names[] = {
MY_ENUM_DEFINITIONS(MAKE_NAME)
}
这与我想要的完全一样,但它使用__ COUNTER __宏并假设宏始终为0.我尝试使用#line指令,但它将所有枚举扩展到相同的值。我需要的是在处理myEnum.h时启动新计数器或重置__ COUNTER __宏的方法。