Это своего рода дополнительный вопрос к Видимость символа и пространство имен
Я немного изменю пример, потому что в действительности это не касается пространства имен:
namespace MyDSO {
struct __attribute__ ((visibility ("hidden"))) Foo {
void bar() {}
};
}
struct Bar {
MyDSO::Foo foo;
};
int main() {}
Компиляция с помощью gcc example.cpp -o example
выдает предупреждение ‘Bar’ declared with greater visibility than the type of its field ‘Bar::foo’
, как в связанном вопросе.
Вопрос: Почему не Я получаю предупреждение, если я
a) явно добавлю видимость по умолчанию в struct Bar, т.е.
namespace MyDSO {
struct __attribute__ ((visibility ("hidden"))) Foo {
void bar() {}
};
}
struct __attribute__ ((visibility ("default"))) Bar {
MyDSO::Foo foo;
};
int main() {}
b) удалить скрытую видимость, добавить видимость по умолчанию для Bar и скомпилировать, используя -fvisibility="hidden"
?
Мне кажется, что конечный результат одинаков, и, действительно, вседвоичные файлы точно такие же (gcc 7.3.1, но и более старые).Если я разделю две структуры на два класса и создам статическую библиотеку с ними, таблицы символов (objdump -t -C) содержат точно такие же символы с точно такими же модификаторами (глобальные, локальные и т. Д.), Только несколько записей впервый столбец (виртуальные адреса) отличается.