我认为您在谈论glibc,而不是glib,而有问题的宏是assert
宏:
在 glibc 中<assert.h>
,定义了NDEBUG
(没有调试),assert
定义为:
#ifdef NDEBUG
#if defined __cplusplus && __GNUC_PREREQ (2,95)
# define __ASSERT_VOID_CAST static_cast<void>
#else
# define __ASSERT_VOID_CAST (void)
#endif
# define assert(expr) (__ASSERT_VOID_CAST (0))
#else
/* more code */
#endif
这基本上意味着assert(whatever);
等同于((void)(0));
,并且什么都不做。
来自 C89 标准(第 4.2 节):
标头<assert.h>
定义assert
宏并引用另一个宏,
NDEBUG
这不是由 定义的<assert.h>
。如果在源文件中包含NDEBUG
的位置处定义为宏名称,则该宏被简单地定义为<assert.h>
assert
#define assert(ignore) ((void)0)
我认为将调试打印宏定义为等于没有(void)0
多大意义。你能告诉我们这是在哪里完成的吗?