c++,宏 - 在debug/release中都能用的断言
文章目录
- c++,宏 - 在debug/release中都能用的断言
- 概述
- 笔记
- 断言宏定义
- 调用代码
- 效果
- debug
- release
- 备注
- END
c++,宏 - 在debug/release中都能用的断言
概述
预定义宏 NDEBUG,表示现在是release编译模式。
预定义宏 _DEBUG, 表示现在是debug编译模式。
在普通宏中或者正常代码行中,不能用预定义宏的值来做条件判断。否则就会在其中一种编译模式下(debug/release)报错 - NDEBUG/-DEBUG未定义
e.g. 错误的姿势
if (NDEBUG) {printf("on release mode\r\n");}
if (_DEBUG) {printf("on debug mode\r\n");}
注意这个细节后,就可以写出一个在debug/release编译模式下都能用的宏。
想在程序中前置条件不满足时,不让程序继续跑, 显示错误发生的文件/行号后, 直接断言或退出。
写了一个断言宏,在debug/release编译模式下都能用。
笔记
断言宏定义
// 打印文件错误行信息
#if defined(NDEBUG)
#define MY_ASSERT_FILE_LINE() \
do { \
fprintf(stderr, "[%s] %s:%d\r\n", "FATAL", __FILE__, __LINE__); \
std::abort(); \
} while (0)
#elif defined(_DEBUG)
#define MY_ASSERT_FILE_LINE() \
do { \
assert(false); \
} while (0)
#endif
// 自定义断言
#define MY_ASSERT(expr, fmt, ...) \
do { \
if (!(expr)) { \
fprintf(stderr, fmt, ##__VA_ARGS__); \
fprintf(stderr, " | "); \
MY_ASSERT_FILE_LINE(); \
} \
} while (0)
调用代码
MY_ASSERT(true, "true = %d", (true == bFixPosOk));
MY_ASSERT(false, "false = %d", (false == bFixPosOk));
效果
debug
release
备注
宏的条件编译写法, 最好用 defined, 更通用。可以进行多条件的判断(宏是否存在,宏的值的比较)
// 好的写法
#if defined(NDEBUG)
#elif defined(_DEBUG)
#endif
// 可以进行多条件的判断
#if (defined(NDEBUG) && defined(MY_CFG_FLAG) && (MY_CFG_FLAG > 200))
#elif defined(_DEBUG)
#endif
// 感觉不好(不通用)的写法
#ifdef NDEBUG
#elif _DEBUG
#endif