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

在宏中嵌入注释遇编译错误:展开正确但提示expected declaration

问题:定义含注释的宏时编译报错“expected declaration”

我想定义一个包含注释的宏,把这段代码:

/* \deprecated "Car is deprecated" */ class [[deprecated("Car is deprecated")]] Car {}

简化成:

DEPRECATED_CLASS("Car is deprecated") Car {}

我尝试拆分多个子宏来实现,宏展开结果看起来是对的,但编译时却报“expected declaration”错误。我的宏定义代码如下:

#define D0(msg) \deprecated msg
#define D1(msg) * D0(msg)*
#define D2(msg) /D1(msg)/

#define DEPRECATED_CLASS(msg) D2(msg) class [[deprecated(msg)]]


DEPRECATED_CLASS("Consider using Ante") Mate
{
   public:
      int a = 0;
   private:
}

错误原因

C++预处理器的执行顺序是先处理注释,再展开宏。你试图通过宏拼接出/* ... */注释,但宏展开是文本替换,此时注释已经过了处理阶段。你的宏展开后会变成/ * \deprecated "xxx" * / class ...(各符号间有空格),这不是合法的注释,编译器会把这些/、*当成无效语法,从而抛出“expected declaration”错误。

正确写法

不需要拆分宏拼接注释,直接把完整的注释和属性写在宏里即可:

#define DEPRECATED_CLASS(msg) /* \deprecated msg */ class [[deprecated(msg)]]

DEPRECATED_CLASS("Consider using Ante") Mate
{
   public:
      int a = 0;
   private:
}; // 注意补全类定义末尾的分号

这样预处理器直接替换出完整的注释和class声明,注释会被正常识别,[[deprecated]]属性也能正确生效。另外原代码中类定义末尾漏了分号,这也是可能引发编译问题的细节,记得补上。

内容的提问来源于stack exchange,提问作者Bruno Perković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:25:20