Visibilidad de símbolos y espacio de nombres

Estoy experimentando con la visibilidad del símbolo C ++ en Linux y gcc. Parece que la forma preferida es usar -fvisibility = hidden, y exportar los símbolos usados ​​uno por uno de acuerdo con la página de Visibility gcc wiki (http://gcc.gnu.org/wiki/Visibility). Mi problema es quemuchos Las bibliotecas no manejan esto bien, se olvidan de exportar explícitamente los símbolos, lo cual es un problema serio. Después de varios errores corregidos, incluso algunas partes de refuerzo pueden verse afectadas. Por supuesto, esos errores deberían solucionarse, pero hasta que me gustaría usar una forma "segura" para ocultar la mayor cantidad de símbolos posible.

Se me ocurrió una solución: coloco todos los símbolos en un espacio de nombres y uso el atributo de ocultación de símbolos y exporto la interfaz pública, de esta manera solo mis símbolos pueden verse afectados.

El problema es que recibí un mensaje de advertencia cuando compilo algo en esa biblioteca para cada clase que no he exportado y uso en la aplicación como campo de clase.

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

struct Bar {
  MyDSO::Foo foo;
};

int main() {}

El mensaje de advertencia se puede reproducir en este pequeño ejemplo, pero, por supuesto, el espacio de nombres debe estar en una biblioteca de la otra clase en la aplicación.

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

Como entiendo la visibilidad de los símbolos, ocultar el espacio de nombres debería tener un efecto similar al del uso de -fvisibility = hidden, pero nunca obtuve advertencias similares con este último. Veo que cuando pase -fvisibility = hidden a la aplicación, la clase en la aplicación también estará oculta, por lo que no recibiré una advertencia. Pero cuando no paso la opción, ninguno de los símbolos en los encabezados parecerá oculto para el compilador, por lo que no volveré a recibir una advertencia.

¿Cuál es la propuesta de este mensaje de advertencia? ¿Es un problema grave? ¿En qué situaciones esto puede causar algún problema? ¿En qué se diferencia el espacio de nombres oculto a la visibilidad = oculto?

Respuestas a la pregunta(2)

Su respuesta a la pregunta