试图理解宏定义

时间:2014-01-29 15:36:26

标签: c++ macros

我找到了一个非常奇怪的代码片段:

//first fragment 
bool status = fileToImage (name, size, stride, data);

//second fragment
WRAPABLE_HND (8, ScreenInterface, bool, fileToImage, CompString &, CompSize &, int &, void *&);


third fragment
#define WRAPABLE_HND(num,itype,rtype, func, ...)    \
rtype func (__VA_ARGS__);               \
void  func ## SetEnabled (itype *obj, bool enabled) \
{                           \
   functionSetEnabled (obj, num, enabled);      \
}                           \
unsigned int func ## GetCurrentIndex ()     \
{                           \
   return mCurrFunction[num];           \
}                           \
void func ## SetCurrentIndex (unsigned int index)   \
{                           \
   mCurrFunction[num] = index;          \
}

你能解释一下上面的宏定义是如何工作的吗?

1 个答案:

答案 0 :(得分:2)

这是一个用于定义一组相关函数的宏。它声明/定义了这些函数:

  • 声明一个名为func(第四个宏参数)的函数,返回rtype(第三个宏参数),其参数类型由第5个和连续的宏参数指定。

    < / LI>
  • 定义一个名为funcSetEnabled的函数(其中func由宏参数替换),该函数获取指向itype(第二个宏参数)和布尔值以及转发的指针它们是一个名为functionSetEnabled()的函数,还有一个参数num(第一个宏参数)。

  • 定义名为funcGetCurrentIndex(再次替换为func)的函数,该函数返回名为num的数组的mCurrFunction个元素。

    < / LI>
  • 定义一个名为funcSetCurrentIndex的函数(func再次替换),它接受一个索引并将其写入名为num的数组的mCurrFunction个元素中

换句话说,它有点像基于预处理器的模板。

在您的示例中,使用参数8, ScreenInterface, bool, fileToImage, CompString &, CompSize &, int &, void *&“调用”宏。因此它将产生以下功能:

bool fileToImage(CompString &, CompSize &, int &, void *&);

void fileToImageSetEnabled(ScreenInterface *obj, bool enabled)
{
  functionSetEnabled(obj, 8, enabled);
}

unsigned int fileToImageGetCurrentIndex()
{
  return mCurrFunction[8];
}

void fileToImageSetCurrentIndex(unsigned int index)
{
  mCurrFunction[8] = index;
}

显然,它就像一个属性生成系统:生成一个函数的原型和几个帮助它的东西。