在使用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