во время компиляции программы с использованием 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