Я получаю эти два предупреждения (с GCC 4.2 на MacOSX):
/Users/az/Programmierung/openlierox/build/Xcode/../../src/main.cpp:154:0/Users/az/Programmierung/openlierox/build/Xcode/../../src/main.cpp:154: предупреждение: 'startMainLockDetector ():: MainLockDetector', объявленный с большей видимостью, чем тип ее поля 'startMainLockDetector ():: MainLockDetector:: <анонимный>'
/Users/az/Programmierung/openlierox/build/Xcode/../../src/main.cpp:154:0/Users/az/Programmierung/openlierox/build/Xcode/../../src/main.cpp:154: предупреждение: 'startMainLockDetector ():: MainLockDetector' объявил с большей видимостью, чем ее основное 'Действие'
В этом коде:
struct Action {
virtual ~Action() {}
virtual int handle() = 0;
};
static void startMainLockDetector() {
/* ... */
struct MainLockDetector : Action {
bool wait(Uint32 time) { /* ... */ }
int handle() { /* ... */ }
};
/* ... */
}
Я не абсолютно уверен, что означают эти предупреждения (что видимость?) и как зафиксировать их. (Я действительно хочу, чтобы класс MainLockDetector был локален для той функции только.)
Я уже скомпилировал тот же код с большим количеством других компиляторов (лязг, GCC 3.*, GCC 4.0, GCC 4.4, и т.д.), и никогда не получал предупреждения для этого кода.
Это потому, что вы забыли объявить наследование как общедоступное.
struct MainLockDetector : public Action {
bool wait(Uint32 time) { /* ... */ }
int handle() { /* ... */ }
};
Это приводит к тому, что члены «Action» становятся закрытыми. Но вы только что переопределили частный член Action как общедоступный ( public default в структуре), что может нарушить инкапсуляцию, отсюда и предупреждение.
Похоже, проблема с разделяемыми библиотеками. Я предполагаю, что вы пишете общую библиотеку. Посмотрите на это объяснение .Попробуйте добавить параметр командной строки -fvisibility-inlines-hidden
. Проблема, похоже, в том, что gcc пытается экспортировать некоторые символы MainLockDetector
(видимые для связывания исполняемых файлов и библиотек), тогда как Action
не экспортируется (невидимо для связывания исполняемых файлов и библиотек). Таким образом, видимость MainLockDetector
действительно выше, чем видимость Action
.
Чтобы решить эту проблему, попробуйте одно из следующих.
Используйте оператор #pragma GCC visibility push ()
, подобный этому.
#pragma Подтверждение видимости GCC (скрыто)
struct MainLockDetector: Action {
bool wait (время Uint32) {/ * ... * /}
int handle () {/ * ... * /}
};
#pragma GCC visibility pop
Используйте __ attribute__ ((visibility ("hidden")))
вот так.
struct __attribute__ ((видимость ("скрытый"))) MainLockDetector: Action {
bool wait (время Uint32) {/ * ... * /}
int handle () {/ * ... * /}
};
Добавьте параметр командной строки -fvisibility = default.
Подробнее см. http://gcc.gnu.org/wiki/Visibility .