在C++03中模拟Lambda实现宏内流程控制的兼容方案
兼容C03/C11的TABORT宏实现方案
核心思路
避开将try-catch块放入__forceinline函数引发的VS C4714警告,直接在宏展开时生成try-catch逻辑;同时通过C版本分支,分别适配C03的可变参数处理和你已实现的C++11 lambda方案,完全不改动宏的原有调用方式。
具体代码实现
#include <cstdio> #include <cstdlib> #include <stdarg.h> #include <exception> // C++03兼容的可变参数输出辅助函数(无需__forceinline) inline void abort_message(const char* fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } // 版本分支处理 #if __cplusplus >= 201103L // 复用你已实现的C++11 lambda方案 #define TABORT(...) do { \ [&]() { \ try { \ abort_message(__VA_ARGS__); \ } catch (...) {} \ }(); \ std::abort(); \ } while(0) #else // C++03专属实现:直接在宏展开中嵌入try-catch,避免内联警告 #define TABORT(...) do { \ try { \ abort_message(__VA_ARGS__); \ } catch (const std::exception&) { \ // 捕获标准异常后不做额外处理,确保abort执行 } catch (...) { \ // 捕获所有非标准异常 } \ std::abort(); \ } while(0) #endif
方案说明
- 消除C4714警告:C++03版本将
try-catch直接展开在调用点的do-while块中,而非放入__forceinline函数内,彻底规避VS的内联限制警告。 - 异常安全保障:无论
__VA_ARGS__中的参数求值是否抛出异常,std::abort()都会被执行,满足需求。 - 调用方式兼容:宏的使用方式完全不变,原有的
TABORT("Error: %d", code);这类调用无需任何修改。 - C++03兼容性:借助C标准库的
va_list处理可变参数,不依赖C++11及以上特性。
内容的提问来源于stack exchange,提问作者Bwmat
相关产品推荐
相关产品推荐

