C预处理器__COUNTER__替代

时间:2015-11-17 16:13:45

标签: c enums macros c-preprocessor

我目前有一个系统,我有一个枚举和一个将枚举值保存为字符串的数组。枚举和数组是通过宏生成的,枚举的实际值除了编号外还要编码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 __宏的方法。

0 个答案:

没有答案