为什么#define STMT(0 || g())会产生编译器错误[-Werror = unused-value]?

在使用Petsc编译程序期间,我偶然发现了类似于以下内容的构造。据我了解,在Petsc中,他们使用它包装对MPI的调用,以便使用集体通信来监视对函数的调用。

#include <stdio.h>

int f() {return 0;}
int g() {printf("g()\n");return 0;}

#define STMT (  0  || g() )

int main()
{
                STMT;
                printf("main()\n");
                return 0;
}

使用gcc编译:

gcc -Wall -Werror ./test.c

引发以下错误/警告:

./test.c:7:20: error: value computed is not used [-Werror=unused-value]
 #define STMT (  0  || g() )
              ~~~~~~^~~~~~~~
              ./test.c:11:3: note: in expansion of macro ‘STMT’
                 STMT;
                    ^~~~
                    cc1: all warnings being treated as errors

为什么编译器会发出此警告? IMHO g()始终执行,并且始终使用计算出的值。

注意:已测试:gcc版本7.4.0(Ubuntu 7.4.0-1ubuntu1〜18.04.1),gcc版本8.3和gcc版本9

pw942mn 回答:为什么#define STMT(0 || g())会产生编译器错误[-Werror = unused-value]?

编译器告诉您未使用(0 || g())的值,这是正确的。您对||的结果不做任何事情。要解决此问题,您应将结果强制转换为void,如下所示:

#define STMT (void)(  0  || g() )
本文链接:https://www.f2er.com/3157793.html

大家都在问