Почему в синтаксисе __attribute __ ((...)) GCC используются двойные скобки? - PullRequest
38 голосов
/ 08 сентября 2011

Документация для синтаксиса __attribute__((...)) в GCC указывает, что атрибуты должны быть заключены в двойные скобки, но не дает обоснования для этого решения о разработке.

Какая практическая причина заставила бы дизайнеров GCC требовать этого? Это как-то связано с обработкой препроцессором двойных скобок?

Ответы [ 2 ]

38 голосов
/ 08 сентября 2011

Чтобы было проще устранить его для другого компилятора. Если у вас есть переносимый код, вы должны удалить его для других компиляторов, поэтому вы делаете

#ifndef __GNUC__
#define __attribute__(x)
#endif

Проблема состоит в том, что атрибуты имеют различное количество аргументов, и вы можете объединить несколько атрибутов в одном объявлении __attribute__, но C только вводил макросы с переменным числом в C99. В двойных скобках приведенное выше определение не требует вариационных макросов.

16 голосов
/ 08 сентября 2011

Вероятно, идея в том, что вы можете объявить простой макрос, который помогает игнорировать все это в любом другом компиляторе C и C ++.Если у вас не будет второй пары круглых скобок, этот макрос обязательно будет с ....Так что для компиляторов, которые не поддерживают, вы были бы испорчены.

Редактировать: С этим синтаксисом он может просто выглядеть как

#ifdef __GNUC__
# define attribute(X) __attribute__(X)
#else
# define attribute(X)
#endif

, и тогда вы будете использоватьattribute для ваших объявлений функций, например

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