Видимость символов и предупреждения GCC - PullRequest
0 голосов
/ 01 июня 2018

Это своего рода дополнительный вопрос к Видимость символа и пространство имен

Я немного изменю пример, потому что в действительности это не касается пространства имен:

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) содержат точно такие же символы с точно такими же модификаторами (глобальные, локальные и т. Д.), Только несколько записей впервый столбец (виртуальные адреса) отличается.

1 Ответ

0 голосов
/ 01 июня 2018

В обоих случаях явный атрибут видимости является предполагаемым способом заставить замолчать предупреждение для каждого класса.От gcc/cp/decl2.c:

/* Don't warn about visibility if the class has explicit visibility.  */
if (CLASSTYPE_VISIBILITY_SPECIFIED (type))
  vis = VISIBILITY_INTERNAL;
...