Visibilité des symboles et espace de noms

Je suis en train d'expérimenter avec C++ symbole de la visibilité sur Linux et gcc. Il semble que le meilleur moyen est d'utiliser -fvisibility=cachés, et d'exporter des symboles utilisés un par un en fonction de la Visibilité de gcc page wiki (http://gcc.gnu.org/wiki/Visibility).
Mon problème est que de nombreux bibliothèques ne gère pas bien, ils oublient explicitement exportation de symboles, ce qui est un grave problème. Après plusieurs corrections de bogues même certaines parties de boost peut encore être affectée. Bien sûr, ces bugs devrait être fixé, mais jusqu'à ce que je voudrais utiliser un "coffre-fort" façon de cacher autant que les symboles que possible.

J'ai trouvé une solution: je mets tous les symboles dans un espace de noms et j'utilise le symbole de cacher de l'attribut et de l'exportation de l'interface publique, de cette façon seulement mon symboles peuvent être affectés.

Le problème est que j'ai eu un message d'avertissement quand je compile quelque chose contre cette bibliothèque pour chaque classe que je n'ai pas exporté et que j'utilise dans l'application en tant que champ de la classe.

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

struct Bar {
  MyDSO::Foo foo;
};

int main() {}

Le message d'avertissement peut être reproduit dans ce petit exemple, mais bien sûr l'espace de noms doit être dans une bibliothèque à l'autre classe de l'application.

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

Que je comprends symbole de la visibilité, de cacher l'espace de noms doit avoir assez effet similaire à l'aide d'-fvisibility=caché, mais je n'ai jamais eu des avertissements similaires à l'aide de ce dernier. Je vois que quand je passe la -fvisibility=masqué à la demande de la classe de l'application sera également caché, donc je ne vais pas obtenir un avertissement. Mais quand je ne passe pas l'option aucun des symboles dans les en-têtes semblent cachés pour le compilateur, donc je ne vais pas obtenir un avertissement de nouveau.

Qu'est-ce que le fait de proposer de ce message d'avertissement? Est-ce un problème grave? Dans quelles situations cela peut causer un problème? Comment cacher l'espace de noms différent de fvisibility=cachés?

source d'informationauteur VargaD