在C ++中混淆宏定义

时间:2014-07-22 14:12:56

标签: 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]; \
  }

我无法理解这个宏是如何工作的,它怎么可能是宏定义中的函数定义?它是#pragma once的单个cpp头文件。

1 个答案:

答案 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的定义。

编辑:为了更清楚地回答如何在宏定义中进行函数定义?你的问题的一部分:宏本身只是粘贴在任何地方使用它。函数定义在被调用时插入,因此每次宏调用都会生成一个函数。