根据我的测试,以下代码会生成警告-Wall -Wextra -O2 -DNDEBUG
:
int a = func(); // warning: unused variable ‘a’
assert(a != 2);
但是下面的代码没有:
// no warnings
int a;
a = func();
assert(a != 2);
但是,您始终可以通过强制转换为来抑制未使用的变量警告void
。
int a = func();
(void) a; // suppresses "unused variable" warning
assert(a != 2);
据我所知, linea = func()
语句总是算作变量的使用a
,而初始化不算作使用。
随着编译器的变化和诊断的改进,我不会尝试对冲未来可能出现的编译器警告,因为对冲有时会意外地抑制有效警告。
断言是如何定义的?
标准委员会和 C 实施者assert
经过精心设计,不会产生虚假警告。请注意演员表的常见void
程度...
如果没有NDEBUG
,glibcassert
大致按以下方式定义(除了 以外的东西abort
):
#define assert(expr) ((expr) ? (void) 0 : abort())
使用NDEBUG
,glibc 以这种方式定义它(按照 C 标准的要求):
#define assert(expr) ((void) 0)
以下定义assert
不符合要求,因为它没有扩展为表达式:
#define assert(expr) { if (expr) { ... } } // wrong
C++ 的定义也略有不同。所以你看,assert
以正确的方式定义,所以它不会产生任何虚假的编译器警告,而且它在语法上确实表现得像函数调用。