有这样的代码:
#include <assert.h>
void fun1()
{
int x;
}
int main()
{
assert(true
==true);
return 0;
}
void fun2()
{
int y;
}
当传递选项x
时,编译器应报告两个未使用的变量y
和-Wall
。
让我们先运行预处理器:
g++ main.cpp -Wall -E -o main2.cpp
输出:
a lot of stuff from assert.h
...
# 2 "main.cpp" 2
void fun1()
{
int x;
}
int main()
{
((true ==true) ? static_cast<void> (0) : __assert_fail ("true ==true",
"main.cpp"
# 10 "main.cpp" 3 4
,
11
# 10 "main.cpp" 3 4
, __PRETTY_FUNCTION__))
;
return 0;
}
void fun2()
{
int y;
}
让我们尝试编译这个东西:
$ g++ main2.cpp -Wall -c -o main2.o
main.cpp: In function ‘void fun1()’:
main.cpp:5:8: warning: unused variable ‘x’ [-Wunused-variable]
int x;
^
第一个未使用的变量只有警告,而第二个没有。看起来在assert
宏之后禁用了一些警告。
但是,当我将assert
更改为单行语句时:
int main()
{
assert(true==true);
return 0;
}
然后这些事情:
# 10 "main.cpp" 3 4
是不是生成的,当我编译预处理文件时,我得到了两个未使用变量的预期警告。
当我从预处理文件中的这些指令中删除3 4
时,我还会收到两条警告:
# 10 "main.cpp" 3 4
到
# 10 "main.cpp"
当assert
内的条件是单行和多行时,为什么编译器(g ++ 4.9.2)的行为如此不同?