Почему этот #define STMT (0 || g ()) выдает ошибку компилятора [-Werror = unused-value]? - PullRequest
1 голос
/ 05 ноября 2019

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

1 Ответ

2 голосов
/ 05 ноября 2019

Компилятор сообщает вам, что значение (0 || g()) не используется, что верно. Вы ничего не делаете с результатом ||. Чтобы это исправить, вы должны привести результат к void, например:

#define STMT (void)(  0  || g() )
...