Видимость символа и пространство имен

Я экспериментирую с видимостью символов C ++ в Linux и gcc. Кажется, что предпочтительным способом является использование -fvisibility = hidden и экспорт используемых символов один за другим в соответствии со страницей Visibility gcc wiki (http://gcc.gnu.org/wiki/Visibility). Моя проблема в том чтомного библиотеки не справляются с этим хорошо, они забывают явно экспортировать символы, что является серьезной проблемой. После нескольких исправленных ошибок могут быть затронуты даже некоторые части наддува. Конечно, эти ошибки должны быть исправлены, но до этого я хотел бы использовать "безопасный" способ скрыть как можно больше символов.

Я пришел к решению: я помещаю все символы в пространство имен и использую для этого атрибут скрытия символов и экспортирую общедоступный интерфейс, так что это может повлиять только на мои символы.

Проблема в том, что я получаю предупреждающее сообщение, когда собираю что-то для этой библиотеки для каждого класса, который у меня есть.т экспортируется и я использую в приложении в качестве поля класса.

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?

Ответы на вопрос(2)

Ваш ответ на вопрос