C可变参数宏可选括号适配:修改ATTR宏实现无参省略括号
宏ATTR的适配修改需求
背景
我有一些形式为ATTR(XXX(...))的宏。ATTR会将XXX处理为宏ATTR_IMPL_XXX(...),其中XXX可接受可变数量的参数(这些可变参数仅传递给另一个宏,且可为空)。
当XXX无参数时,我希望能以对象式宏XXX的形式使用它(即ATTR(XXX)),而非必须为函数式宏XXX()添加多余空括号(即ATTR(XXX())),此时有无括号在最终展开中需完全等价。
问题
我想了解如何修改宏ATTR,使其能检测传入的XXX是否带有括号,并在未提供括号时在展开结果中添加括号;即需将XXX或XXX()处理为等价结果。
示例
使用场景
以下用法功能等价:
ATTR(XXX) ATTR(XXX()) // 两者均展开为:ATTR_IMPL_XXX()
仍需支持带参数的使用场景:
ATTR(XXX(some, args)) // 展开为:ATTR_IMPL_XXX(some, args)
展开示例
参考@EricPostpischil的思路:
#define ATTR(ARG) ATTR_IMPL_##ARG #define ATTR_IMPL_XXX(...) /* 具体实现内容 */ ATTR(XXX); ATTR(XXX()); ATTR(XXX(1, 2, 3)); // 展开结果: // ATTR_IMPL_XXX(); // ATTR_IMPL_XXX(); // ATTR_IMPL_XXX(1, 2, 3);
说明
- 我并非询问能否直接使用带或不带括号的宏
XXX——我知道这不可行(函数式宏与对象式宏不能同名) - 允许为
ATTR添加更多宏/间接层级(如用标记粘贴检测无括号情况) - 不允许使用另一个名为
XXX_NO_ARGS的对象式宏(#define XXX_NO_ARGS XXX()) - 我并非询问如何使用可变参数宏或宏参数
- 这并非X/Y问题,我仅想了解能否将宏名
XXX不带括号地作为ATTR的参数使用 - 我已实现将
ATTR(XXX(...))转换为ATTR_IMPL_XXX(...)的宏,愿意按第2点修改ATTR的内容
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

