我收到了这两个警告(在MacOSX上使用GCC 4.2):
/ 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 ::< anonymous>'
的类型/ Users / az / Programmierung / openlierox / build / Xcode /../../ src / main.cpp:154:0 /Users/az/Programmierung/openlierox/build/Xcode/../../ src / main.cpp:154:警告:声明'startMainLockDetector():: MainLockDetector'的可见性高于其基础'Action'
在此代码中:
struct Action {
virtual ~Action() {}
virtual int handle() = 0;
};
static void startMainLockDetector() {
/* ... */
struct MainLockDetector : Action {
bool wait(Uint32 time) { /* ... */ }
int handle() { /* ... */ }
};
/* ... */
}
我不确定这些警告意味着什么(能见度?)以及如何修复它们。 (我真的希望类MainLockDetector只对该函数是本地的。)
我已经与许多其他编译器(clang,GCC 3. *,GCC 4.0,GCC 4.4等)编译了相同的代码,并且从未对此代码发出任何警告。
答案 0 :(得分:4)
要解决此问题,请尝试以下方法之一。
像这样使用#pragma GCC visibility push()
语句。
#pragma GCC visibility push(hidden)
struct MainLockDetector : Action {
bool wait(Uint32 time) { /* ... */ }
int handle() { /* ... */ }
};
#pragma GCC visibility pop
像这样使用__attribute__ ((visibility("hidden")))
。
struct __attribute__ ((visibility("hidden"))) MainLockDetector : Action {
bool wait(Uint32 time) { /* ... */ }
int handle() { /* ... */ }
};
添加命令行选项-fvisibility = default。
有关详细信息,请参阅http://gcc.gnu.org/wiki/Visibility。
答案 1 :(得分:1)
共享库似乎存在问题。我假设您正在编写共享库。看看this explanation。尝试添加命令行选项-fvisibility-inlines-hidden
。问题似乎是,gcc尝试导出MainLockDetector
的一些符号(链接可执行文件和库可见),而Action
不导出(链接可执行文件和库不可见)。因此MainLockDetector
的可见性确实高于Action
的可见性。
答案 2 :(得分:-4)
这是因为您忘记将继承声明为公开。
struct MainLockDetector : public Action {
bool wait(Uint32 time) { /* ... */ }
int handle() { /* ... */ }
};
这会导致“Action”成员变为私有。但是,您刚刚将Action私有成员重写为public(结构中的公共默认值),这可能会破坏封装,从而导致警告。