我想知道是否可以“嵌套”可变参数宏调用。我只真正关心 GCC 和 Clang。我的宏定义如下:
/**
* @brief Invoke an instance method.
*/
#define $(obj, method, ...) \
({ \
typeof(obj) _obj = obj; \
_obj->interface->method(_obj, ## __VA_ARGS__); \
})
我用它来方便地调用我的 OO 框架中的“实例方法”(https://github.com/jdolan/objectively):
$(array, addObject, obj);
工作老板。不幸的是,我还没有找到一种允许嵌套这些调用的方法,这在某些情况下非常有用;例如。:
/**
* @see MutableSetInterface::addObjectsFromArray(MutableSet *, const Array *)
*/
static void addObjectsFromArray(MutableSet *self, const Array *array) {
if (array) {
for (size_t i = 0; i < array->count; i++) {
$(self, addObject, $(array, objectAtIndex, i));
}
}
}
上面的嵌套可变参数宏调用无法编译,因为内部调用永远不会扩展。是否可以解决这个问题,或者我是否已经滥用预处理器到其极限? :)