我认为您在谈论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多大意义。你能告诉我们这是在哪里完成的吗?