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

能否借助__COUNTER__与#pragma push/pop_macro优化SECTION宏?

实现方案

完全可以通过__COUNTER__结合#pragma push_macro/pop_macro实现移除SECTION_STOP的name参数的需求,核心是用自动生成的唯一标识符绑定每个SECTION_START创建的对象,同时通过宏的压栈/出栈处理嵌套场景。

最终宏定义如下:

// 先声明空宏用于后续压栈操作
#define SECTION_CURRENT_VAR

#define SECTION_START(...) \
    /* 用__COUNTER__生成唯一后缀,创建section对象 */ \
    auto section_##__COUNTER__ = create_section_name(#__VA_ARGS__, ## __VA_ARGS__); \
    /* 保存当前SECTION_CURRENT_VAR的宏定义到栈中 */ \
    _Pragma("push_macro(\"SECTION_CURRENT_VAR\")") \
    /* 重新定义SECTION_CURRENT_VAR为当前创建的变量名 */ \
    #define SECTION_CURRENT_VAR section_##__COUNTER__

#define SECTION_STOP() \
    /* 调用当前绑定的section对象的reset方法 */ \
    SECTION_CURRENT_VAR.reset(); \
    /* 恢复上一层的SECTION_CURRENT_VAR宏定义 */ \
    _Pragma("pop_macro(\"SECTION_CURRENT_VAR\")")

关键细节说明

  • __COUNTER__每次预处理时生成递增整数,确保每个SECTION_START创建的变量名唯一(如section_0、section_1...),避免命名冲突。
  • #pragma push_macro/pop_macro负责宏定义的栈式管理:内层SECTION_START会覆盖SECTION_CURRENT_VAR,内层SECTION_STOP执行后自动恢复外层的宏定义,完美支持嵌套场景,不会出现对象绑定错乱。
  • _Pragma是标准C++写法,能在宏内部正确展开,部分编译器也支持直接写#pragma,效果一致。

嵌套使用示例

void test_nested() {
    SECTION_START("outer_section")
    {
        SECTION_START("inner_section")
        // 此SECTION_STOP对应inner_section的对象
        SECTION_STOP()
    }
    // 此SECTION_STOP对应outer_section的对象
    SECTION_STOP()
}

内容的提问来源于stack exchange,提问作者Kron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:03:14