Использование ({...}) скобок в макросах для поглощения точки с запятой - PullRequest
6 голосов
/ 23 марта 2011

Часто в макросах вы увидите, что люди используют do { ... } while(0) для проглатывания точки с запятой. Я только что натолкнулся на пример, где вместо них используется ({ ... }), и кажется, что он не только глотает точку с запятой, но и позволяет вам возвращать значение:

#define NEW_MACRO()  ({ int x = 1; int y = 2; x+y; })

 if(1) 
   val = NEW_MACRO(); 
 else 
   printf("this never prints");`

val получилось бы 3. Я не могу найти никакой документации по этому вопросу, поэтому я немного настороженно отношусь к этому. Есть ли какие-нибудь ошибки с этим методом?

Ответы [ 3 ]

10 голосов
/ 23 марта 2011

Это недопустимо в стандарте C.

Некоторые компиляторы могут иметь расширения (например, выражения оператора GCC ), которые допускают подобные вещи.

2 голосов
/ 23 марта 2011

Как правильно сказал Оли, это было изобретено gcc.Цель состоит в том, чтобы (часто с их расширением typeof) иметь возможность оценивать макроэлементы только один раз и использовать это вычисленное значение позже, используя имя.

Много раз такого использования можно полностью избежать, используяinline функции.У них также есть (dis) преимущество в том, что они более строги к типам.

В некоторых других случаях, когда вам просто нужна временная переменная, адрес которой вы передаете функции, C99 также имеет составные литералы, которые можно использовать дляэто.

0 голосов
/ 23 марта 2011

do { ... } while(0) не для "проглатывания точки с запятой". Он предназначен для преобразования выражения C в оператор C.

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