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

使用宏初始化嵌套结构体时出现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 { \
      |        

问题分析与修复

  1. 两处核心语法错误

    • 子配置宏MYCLASS_DEFAULT_SUBOPT_CONFIG中,结构体成员初始化用了分号;,C++结构体初始化列表必须用逗号,分隔成员。
    • 主函数中调用MYCLASS_DEFAULT_CONFIG()时多了括号,宏本身已经是完整的结构体初始化表达式,加括号后会触发语法解析错误。
    • 额外问题:原代码中myclass的构造函数是private权限,主函数无法实例化对象,需要改为public。
  2. 修正后的完整代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:05:44