Я экспериментирую с видимостью символа С++ в Linux и gcc. Кажется, что предпочтительный способ - использовать -fvisibility = hidden и экспортировать используемые символы один за другим в соответствии с вики-страницей видимости gcc (http://gcc.gnu.org/wiki/Visibility). Моя проблема в том, что многие библиотеки не справляются с этим, они забывают явно экспортировать символы, что является серьезной проблемой. После нескольких исправленных ошибок даже некоторые части повышения могут все еще быть затронуты. Конечно, эти ошибки должны быть исправлены, но до этого я хотел бы использовать "безопасный" способ скрыть как можно больше символов.
Я придумал решение: я помещаю все символы в пространство имен, и на этом я использую атрибут hide hide и экспортирую публичный интерфейс, таким образом меня могут затронуть только мои символы.
Проблема заключается в том, что я получил предупреждающее сообщение, когда компилирую что-то против этой библиотеки для каждого класса, который я не экспортировал, и использую в приложении как поле класса.
namespace MyDSO __attribute__ ((visibility ("hidden"))) {
struct Foo {
void bar() __attribute__ ((visibility ("default"))) {}
};
}
struct Bar {
MyDSO::Foo foo;
};
int main() {}
Предупреждающее сообщение может быть воспроизведено в этом маленьком примере, но, конечно, пространство имен должно быть в библиотеке другого класса в приложении.
$ gcc-4.7.1 namespace.cpp -o namespace
namespace.cpp:7:8: warning: ‘Bar’ declared with greater visibility than the type of its field ‘Bar::foo’ [-Wattributes]
Как я понимаю, видимость символов, скрытие пространства имен должно иметь совершенно аналогичный эффект использования -fvisibility = hidden, но я никогда не получал подобных предупреждений с использованием последнего. Я вижу, что когда я передаю -fvisibility = hidden в приложение, класс в приложении также будет скрыт, поэтому я не получу предупреждение. Но когда я не передаю этот параметр, ни один из символов в заголовках не будет скрыт от компилятора, поэтому я не получу предупреждение снова.
Что предлагает это предупреждение? Это серьезная проблема? В каких ситуациях это может вызвать проблемы? Как скрыть пространство имен отличается от fvisibility = hidden?