Что касается вашего вопроса (2) ...
Синтаксис двойного parens для __attribute__
позволяет вам #define
исключить его на компиляторах, не поддерживающих GCC:
#ifndef __GNUC__
#define __attribute__(x)
#endif
Двойные паренсы позволяют усложнять содержимое (например, последовательность атрибутов, разделенных запятыми) и по-прежнему выбираться простым макросом.