Больше информации о `({});` в C? - PullRequest
8 голосов
/ 16 января 2010

Я заметил, что иногда макросы C пишутся примерно так:

#define foo(bar) ({ ++bar; })

После некоторых экспериментов я обнаружил, что:

  1. ({}); будет компилироваться, но ничего не делать. (Как и ожидалось.)
  2. Если вы выключите ;, это приведет к синтаксической ошибке. Побочным эффектом этого является обеспечение того, что foo () выглядит как функция в вашем коде. (Хотя, если вы оставите точку с запятой выключенной, ошибка не очень полезна для диагностики проблемы!)
  3. return ({}); жалуется на то, что значение void не игнорируется, как если бы я пытался использовать функцию void.

Это просто для того, чтобы разработчики добавили точку с запятой в свои макросы или это имеет другую цель? Я пробовал Google, но он с треском проваливается. Есть ли имя для этого?

Ответы [ 3 ]

8 голосов
/ 16 января 2010

Это расширение GNU, которое называется операторными выражениями .

При объявлении макросов в стандарте C вы часто видите циклы do...while(0), используемые для аналогичных целей (т. Е. Для создания области видимости блока),Выражение оператора превосходит взлом цикла, поскольку оно может возвращать значение.Если вы хотите сделать что-то похожее в стандарте C, вам придется определить дополнительную функцию и потерять удобство лексической области видимости.

3 голосов
/ 16 января 2010

Крутая вещь в выражениях операторов (если есть крутая вещь) заключается в том, что последний оператор является результатом выражения.

#define foo(bar) ({ ++bar; 3.1415927; })

int i = 0;
float pi = foo(i);
2 голосов
/ 16 января 2010

() является выражением. ({code; code;}) является составным оператором внутри выражения. Это расширение GNU C.

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

РЕДАКТИРОВАТЬ: вау, я получил эту ссылку от Google и не заметил, что это было для gcc 2.95 вначале. Древнее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...