Использование скрытой видимости - отличный способ убедиться, что ваша библиотека используется только через указанные точки доступа.Это огромное преимущество, если вы когда-нибудь измените его, так как вы точно знаете, как ваша библиотека используется снаружи, и, следовательно, ограничение того, что вы можете потенциально сломать.
Это очень похожая техника на Windows, которая заставляет вас declspecчто является частью доступной части DLL, за исключением небольшой разницы, которую вы не указываете при импорте или экспорте, и поэтому ваша библиотека может создавать «видимые» функции, которые она использует, а не реализует.
Чтобы ответить на ваш вопрос, я думаю, что видимость поддерживается только в версии 4 и выше.Конечно, мы используем его здесь с этим
#if defined(__GNUC__) && __GNUC__ >= 4
Когда вы используете скрытую видимость, вам необходимо четко указать, какие символы вы хотите видеть.Таким образом, у вас есть это:
__attribute__((visibility("default")))
, который вы, вероятно, #define, чтобы быть чем-то более читабельным, может быть, SO_EXPORT, таким образом:
#define SO_EXPORT __attribute__((visibility("default")))
Определить классы:
class SO_EXPORT MyAccessInterface;
и методы что-то вроде:
SO_EXPORT int doSomething( parameters );
На самом деле у нас также есть подобные макросы для скрытой видимости(как указано выше, но с «скрытым» вместо «по умолчанию»).Таким образом, даже когда мы используем видимость «по умолчанию» для всего проекта, мы можем скрыть некоторые детали реализации.
#define SO_HIDDEN __attribute__((visibility("hidden")))
class SO_HIDDEN MyClassImpl;