使用宏初始化嵌套结构体时出现Expected primary expression错误,如何解决?
宏初始化嵌套结构体配置的编译错误解决
我尝试通过宏默认初始化一个包含子配置结构体的配置结构体,代码如下:
#include <cstdio> #define MYCLASS_DEFAULT_CONFIG mylib::options { \ .a_ = 2, \ .b_ = 3, \ .subopts_ = MYCLASS_DEFAULT_SUBOPT_CONFIG() \ } #define MYCLASS_DEFAULT_SUBOPT_CONFIG mylib::sub_options { \ .c_ = 'A'; \ .d_ = 'H'; \ } namespace mylib { struct sub_options { char c_; char d_; }; struct options { int a_; int b_; sub_options subopts_; }; class myclass { myclass(options opts) : opts_ { opts } { } options opts_; }; } int main() { mylib::myclass some_class(MYCLASS_DEFAULT_CONFIG()); return 0; }
使用x86 GCC 12.2编译时,出现以下错误:
<source>:3:47: error: expected primary-expression before '{' token 3 | #define MYCLASS_DEFAULT_CONFIG mylib::options { \ |
问题分析与修复
两处核心语法错误
- 子配置宏
MYCLASS_DEFAULT_SUBOPT_CONFIG中,结构体成员初始化用了分号;,C++结构体初始化列表必须用逗号,分隔成员。 - 主函数中调用
MYCLASS_DEFAULT_CONFIG()时多了括号,宏本身已经是完整的结构体初始化表达式,加括号后会触发语法解析错误。 - 额外问题:原代码中
myclass的构造函数是private权限,主函数无法实例化对象,需要改为public。
- 子配置宏
修正后的完整代码
#include <cstdio> #define MYCLASS_DEFAULT_SUBOPT_CONFIG mylib::sub_options { \ .c_ = 'A', \ .d_ = 'H' \ } #define MYCLASS_DEFAULT_CONFIG mylib::options { \ .a_ = 2, \ .b_ = 3, \ .subopts_ = MYCLASS_DEFAULT_SUBOPT_CONFIG \ } namespace mylib { struct sub_options { char c_; char d_; }; struct options { int a_; int b_; sub_options subopts_; }; class myclass { public: myclass(options opts) : opts_ { opts } { } private: options opts_; }; } int main() { mylib::myclass some_class(MYCLASS_DEFAULT_CONFIG); return 0; }
优化建议
若使用C++11及以上标准,推荐用constexpr常量替代宏,类型更安全且可读性更好:
namespace mylib { constexpr sub_options default_subopts = {'A', 'H'}; constexpr options default_opts = {2, 3, default_subopts}; }
主函数中直接使用mylib::default_opts即可完成初始化。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

