最近,我正在阅读B-Human的一些代码,我发现了这个令人困惑的片段:
void enumInit(char* enums, const char** names, int numOfEnums);
#define ENUM(Enum, ...) \
enum Enum : unsigned char {__VA_ARGS__, numOf##Enum##s}; \
inline static const char* getName(Enum e) \
{ \
static char enums[] = #__VA_ARGS__; \
static const char* names[numOf##Enum##s]; \
static bool init = true; \
if(init) \
{ \
enumInit(enums, names, numOf##Enum##s); \
init = false; \
} \
return e >= numOf##Enum##s ? 0 : names[e]; \
}
Run Code Online (Sandbox Code Playgroud)
我无法理解这个宏是如何工作的,它怎么可能是宏定义中的函数定义?它是#pragma一次的单个cpp头文件.
void enumInit(char* enums, const char** names, int numOfEnums);
Run Code Online (Sandbox Code Playgroud)
您发布的代码中没有定义任何地方,所以严格来说我不知道它的作用。
#define ENUM(Enum, ...) \
enum Enum : unsigned char {__VA_ARGS__, numOf##Enum##s}; \
Run Code Online (Sandbox Code Playgroud)
这定义了一个枚举,其中传递给宏的值作为“...”(google“可变参数宏”)作为值,以及一个附加条目,其值是该宏中元素的数量,其名称是“numOf”的串联"、Enum 的值(作为参数传递)和“s”。n如果枚举包含n其他值(从 0 开始),则最后一个值是具有值和位置的条目。
inline static const char* getName(Enum e) \
{ \
static char enums[] = #__VA_ARGS__; \
static const char* names[numOf##Enum##s]; \
static bool init = true; \
if(init) \
{ \
enumInit(enums, names, numOf##Enum##s); \
init = false; \
} \
return e >= numOf##Enum##s ? 0 : names[e]; \
}
Run Code Online (Sandbox Code Playgroud)
无论您的宏被调用,这都定义了一个内联函数。它定义了一个静态数组,其中包含枚举条目 ( ) 的字符串化值enums[]及其名称 ( names[...])。初秋,enumInit(...)谓之。该函数可能会names用相应枚举值的名称填充数组。为此,enums[]使用存储在内部的字符串。要知道它到底是如何工作的,我需要知道 的定义enumInit。
编辑:为了更清楚地回答它怎么可能是宏定义中的函数定义?您的问题的一部分:宏本身只是粘贴到使用它的地方。函数定义会插入到调用的任何位置,以便每次宏调用都会生成一个函数。