Widoczność symbolu i przestrzeń nazw

Eksperymentuję z widocznością symbolu C ++ w systemie Linux i gcc. Wydaje się, że preferowanym sposobem jest użycie opcji -fvisibility = hidden i eksportowanie używanych symboli jeden po drugim, zgodnie ze stroną wiki Viscity gcc (http://gcc.gnu.org/wiki/Visibility). Moim problemem jest towiele biblioteki nie radzą sobie z tym dobrze, zapominają o wyraźnym wyeksportowaniu symboli, co stanowi poważny problem. Po kilku naprawionych błędach może nawet wpłynąć na niektóre elementy wzmocnienia. Oczywiście te błędy powinny zostać naprawione, ale do tego czasu chciałbym użyć „bezpiecznego” sposobu na ukrycie jak największej liczby symboli.

Wymyśliłem rozwiązanie: umieszczam wszystkie symbole w przestrzeni nazw i używam na tym symbolu Ukryj atrybut i eksportuję interfejs publiczny, w ten sposób tylko moje symbole mogą zostać naruszone.

Problem polega na tym, że otrzymałem komunikat ostrzegawczy, gdy kompiluję coś przeciwko tej bibliotece dla każdej klasy, której nie wyeksportowałem i używam w aplikacji jako pole klasy.

namespace MyDSO __attribute__ ((visibility ("hidden"))) {
  struct Foo {
    void bar() __attribute__ ((visibility ("default"))) {}
  };
}

struct Bar {
  MyDSO::Foo foo;
};

int main() {}

Komunikat ostrzegawczy może zostać odtworzony w tym małym przykładzie, ale oczywiście przestrzeń nazw powinna znajdować się w bibliotece drugiej klasy w aplikacji.

$ 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]

Ponieważ rozumiem widoczność symboli, ukrywanie przestrzeni nazw powinno mieć podobny efekt do używania -fvisibility = ukryty, ale nigdy nie dostałem podobnych ostrzeżeń za pomocą tego drugiego. Widzę, że kiedy przekazuję -fvisibility = ukryty do aplikacji, klasa w aplikacji również będzie ukryta, więc nie dostanę ostrzeżenia. Ale gdy nie przekażę opcji, żaden z symboli w nagłówkach nie będzie ukryty dla kompilatora, więc nie otrzymam ostrzeżenia ponownie.

Jaka jest propozycja tego komunikatu ostrzegawczego? Czy to poważny problem? W jakich sytuacjach może to spowodować jakiś problem? Jak ukrywanie przestrzeni nazw jest inne niż fvisibility = ukryte?

questionAnswers(2)

yourAnswerToTheQuestion