do ... while (0) определяет блок и поддержку приведения типа - PullRequest
0 голосов
/ 29 мая 2018

Какой макрос является правильным для поддержки блока кода и при этом допускает приведение типов?

if (fooisneeded)
    (void)foo();

#define foo() do {foo_subpart1(); foo_subpart2;} while(0): не допустит приведение типов

#define foo() 0; do {foo_subpart1(); foo_subpart2;} while(0): сломаетсяв бесшнуровом if / <loop>

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Нестандартно, если это должен быть макрос, вы можете использовать расширение операторов как выражение (доступно, по крайней мере, для gcc, tcc и clang)

#define foo() ({ for(;;);  }) 
//equivalent to a func returning void or whatever the type of
//the last statement before }) is
int main()
{
    (void)foo();
}

В противном случае, void /статические функции.

0 голосов
/ 29 мая 2018

Использование (void) foo() просто невозможно с макросами, потому что эта конструкция опирается на тип возвращаемого значения, которого макрос по своей природе не имеет.Макрос также не знает о семантике или синтаксисе языка Си, поэтому вычисление возвращаемого типа уже невозможно.

Какой смысл в любом случае?Приведение выражений функций к (void) предназначено для того, чтобы сообщить компилятору: «Вам это не понадобится».Макрос даже не возвращает значение, он просто выполняет текстовую подстановку.Вам не понадобится «вам это не понадобится».

Вместо этого используйте функцию inline или просто функцию.Если вам нужно делать подобные вещи, то макросы - не тот инструмент.

...