C 语言开发问题:使用 <assert.h> 时,定义的 #define NDEBUG 不生效
问题与处理策略
问题描述
#include <stdio.h>
#include <assert.h>#define NDEBUGint divide(int a, int b) {assert(b != 0); // 确保除数不为 0return a / b;
}int main() {printf("%d\n", divide(10, 2));printf("%d\n", divide(10, 0));return 0;
}
# 输出结果5
Assertion failed: b != 0
- 其中,定义的
#define NDEBUG
不生效,assert 操作还是发生
问题原因
-
#define NDEBUG
必须写在#include <assert.h>
之前,否则assert()
不会被禁用 -
assert 是一个宏,
<assert.h>
在首次包含时会根据NDEBUG
是否存在来决定assert()
的行为,详见源码
#ifdef NDEBUG#define assert(expression) ((void)0)#else_ACRTIMP void __cdecl _wassert(_In_z_ wchar_t const* _Message,_In_z_ wchar_t const* _File,_In_ unsigned _Line);#define assert(expression) (void)( \(!!(expression)) || \(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \)#endif
处理策略
#define NDEBUG
必须要在#include <assert.h>
之前
#define NDEBUG#include <stdio.h>
#include <assert.h>int divide(int a, int b) {assert(b != 0); // 确保除数不为 0return a / b;
}int main() {printf("%d\n", divide(10, 2));printf("%d\n", divide(10, 0));return 0;
}
# 输出结果5
(进程 23256)已退出,代码为 -1073741676 (0xc0000094)。