最近,我正在阅读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]; \
}
我无法理解这个宏是如何工作的,它怎么可能是宏定义中的函数定义?它是#pragma once的单个cpp头文件。
答案 0 :(得分:2)
void enumInit(char* enums, const char** names, int numOfEnums);
不会在您发布的代码中的任何位置定义,因此严格来说,我不知道它的作用。
#define ENUM(Enum, ...) \
enum Enum : unsigned char {__VA_ARGS__, numOf##Enum##s}; \
这定义了一个枚举,其中传递给宏的值为" ..." (google" variadic macro")作为值,以及一个附加条目,其值是该宏中元素的数量,其名称是" numOf"的串联,Enum的值(作为参数传递而且" s"。如果枚举包含n
个其他值(从0开始),则最后一个值是值和位置n
的条目。
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]; \
}
这定义了一个内联函数,无论你的宏被调用。它定义了一个静态数组,其中包含枚举条目(enums[]
)的字符串化值及其名称(names[...]
)。在第一个秋天,调用enumInit(...)
。可能,此函数使用相应枚举值的名称填充names
数组。为此,使用存储在enums[]
内的字符串。要知道这究竟是如何工作的,我需要知道enumInit
的定义。
编辑:为了更清楚地回答如何在宏定义中进行函数定义?你的问题的一部分:宏本身只是粘贴在任何地方使用它。函数定义在被调用时插入,因此每次宏调用都会生成一个函数。