在C++中混淆宏定义

zqz*_*ao5 5 c++ macros

最近,我正在阅读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头文件.

and*_*ras 2

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

编辑:为了更清楚地回答它怎么可能是宏定义中的函数定义?您的问题的一部分:宏本身只是粘贴到使用它的地方。函数定义会插入到调用的任何位置,以便每次宏调用都会生成一个函数。