Зачем нам нужны скобки вокруг блочного макроса? - PullRequest
6 голосов
/ 15 ноября 2011

В Linux макрос container_of заключен в, казалось бы, «лишние» скобки:

 #define container_of(ptr, type, member) ({ \
                const typeof( ((type *)0)->member ) *__mptr = (ptr); 
                (type *)( (char *)__mptr - offsetof(type,member) );})

Вместо него мы можем просто использовать

 #define container_of(ptr, type, member) { \
                const typeof( ((type *)0)->member ) *__mptr = (ptr); 
                (type *)( (char *)__mptr - offsetof(type,member) );}

?

Обязательные скобки или просто для предосторожности?

Ответы [ 2 ]

11 голосов
/ 15 ноября 2011

Это необходимо. Одним из используемых "приемов" являются выражения оператора GCC , для которых требуется этот "странный" синтаксис ({ code }).

Код, который использует этот макрос, не будет компилироваться без него в большинстве случаев использования (и он не является допустимым C).

Смотрите также: Обоснование за макросом container_of в linux / list.h

И: Контейнер Грег Кроа-Хартман.

9 голосов
/ 16 ноября 2011

({...}) - это группа в скобках, кодовый блок, который можно использовать внутри выражения. Последнее утверждение определяет его значение.

Внутри макросов вы используете его, чтобы позволить макросам вести себя так же, как функции. В большинстве случаев предпочтительнее использовать функцию static inline.

Похожие вопросы:

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