能否借助__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
相关产品推荐
相关产品推荐

