Вариант определения пространства имен и значения __visibility__ - PullRequest
2 голосов
/ 07 июня 2011

Сегодня, увидев предварительно обработанный код <iostream> (g ++ 4.4.1), я увидел строку, довольно необычную для меня синтаксически.

namespace std __attribute__ ((__visibility__ ("default"))) {
// ...
}

У меня есть вопросыдля этой конкретной строки:

  1. Что такое __attribute__ и что он делает после std?(новый синтаксис!)
  2. Как двойные скобки появляются на месте (( ... )) и является ли это новым синтаксисом?
  3. Что такое __visibility__ и что он задает как "default"?

Ответы [ 3 ]

2 голосов
/ 07 июня 2011

Это специфичная для компилятора функция, используемая более новыми версиями gcc для управления тем, какие символы экспортируются из общего объекта.Подробнее см. http://gcc.gnu.org/wiki/Visibility.

2 голосов
/ 07 июня 2011

Что касается вашего вопроса (2) ...

Синтаксис двойного parens для __attribute__ позволяет вам #define исключить его на компиляторах, не поддерживающих GCC:

#ifndef __GNUC__
#define __attribute__(x)
#endif

Двойные паренсы позволяют усложнять содержимое (например, последовательность атрибутов, разделенных запятыми) и по-прежнему выбираться простым макросом.

2 голосов
/ 07 июня 2011

__attribute__ - это расширение языка , специфичное для gcc. Позволяет изменить объявление функции, пространства имен или другого объекта способами, которые напрямую не поддерживаются стандартным языком C ++.

C ++ 0x добавляет языковую поддержку для атрибутов, хотя синтаксис отличается, и большинство атрибутов по-прежнему зависят от реализации.

...