Подтвердить что ты не робот

Почему синтаксис GCC __attribute __ ((...)) использует двойные скобки?

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

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

4b9b3361

Ответ 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 для своих объявлений функций, например