我找到了一个非常奇怪的代码片段:
//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; \
}
你能解释一下上面的宏定义是如何工作的吗?
答案 0 :(得分:2)
这是一个用于定义一组相关函数的宏。它声明/定义了这些函数:
声明一个名为func
(第四个宏参数)的函数,返回rtype
(第三个宏参数),其参数类型由第5个和连续的宏参数指定。
定义一个名为funcSetEnabled
的函数(其中func
由宏参数替换),该函数获取指向itype
(第二个宏参数)和布尔值以及转发的指针它们是一个名为functionSetEnabled()
的函数,还有一个参数num
(第一个宏参数)。
定义名为funcGetCurrentIndex
(再次替换为func
)的函数,该函数返回名为num
的数组的mCurrFunction
个元素。
定义一个名为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;
}
显然,它就像一个属性生成系统:生成一个函数的原型和几个帮助它的东西。