在宏中嵌入注释遇编译错误:展开正确但提示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ć
相关产品推荐
相关产品推荐

