Какая практическая причина заставила бы разработчиков GCC потребовать это? Имеет ли это какое-либо отношение к обработке препроцессора с двойными скобками?
Почему синтаксис GCC __attribute __ ((...)) использует двойные скобки?
Ответ 1
Чтобы было проще устранить его для разных компиляторов. Если у вас есть переносимый код, вы должны удалить его для других компиляторов, поэтому вы делаете
#ifndef __GNUC__
#define __attribute__(x)
#endif
Проблема заключается в том, что атрибуты имеют различное количество аргументов, и вы можете комбинировать несколько атрибутов в одном объявлении __attribute__
, но C только вводили переменные макросы в C99. С двойными скобками приведенное выше определение не требует переменных макросов.
Ответ 2
возможно, идея состоит в том, что вы можете объявить простой макрос, который помогает игнорировать все это в любом другом компиляторе C и С++. Если бы у вас не было второй пары скобок, макрос был бы обязательно одним с ...
. Поэтому для компиляторов, которые не поддерживают то, что вы будете ввернуты.
Изменить: с помощью этого синтаксиса он может просто выглядеть как
#ifdef __GNUC__
# define attribute(X) __attribute__(X)
#else
# define attribute(X)
#endif
а затем вы должны использовать attribute
для своих объявлений функций, например