gpt4 book ai didi

c - 可变参数宏:粘贴 token 的扩展

转载 作者:行者123 更新时间:2023-11-30 16:05:38 26 4
gpt4 key购买 nike

我想知道是否有可能“嵌套”可变参数宏调用。我只真正关心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));
}
}
}


上面的嵌套可变参数宏调用无法编译,因为内部调用从未扩展。是否可以解决此问题,或者我是否已将预处理器滥用到极限? :)

最佳答案

这是嵌套预处理器宏的常见问题。预处理器扩展规则相当神秘。相关的tl; dr是宏在层中扩展。解决方法是添加一个间接层,可以在其中扩展参数:

#define MI(obj, method, ...) \
({ \
typeof(obj) _obj = obj; \
_obj->interface->method(_obj, ## __VA_ARGS__); \
})

#define M(obj, method, ...) MI(obj, method, __VA_ARGS__)

// This will now expand properly.
M(self, addObject, M(array, objectAtIndex, M(foo, bar, i)))


旁注:请注意, $不是C的基本源字符集的一部分;使用它可能不是便携式的。

关于c - 可变参数宏:粘贴 token 的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60230282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com