当源代码首先被预处理然后编译时,g ++中的多行断言条件使警告静音

时间:2015-09-24 17:07:32

标签: c++ macros g++

有这样的代码:

#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)的行为如此不同?

0 个答案:

没有答案