You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:14:57