C++:警告:“...”声明的可见性高于其字段“...::<anonymous>”的类型
Posted
技术标签:
【中文标题】C++:警告:“...”声明的可见性高于其字段“...::<anonymous>”的类型【英文标题】:C++: warning: '...' declared with greater visibility than the type of its field '...::<anonymous>' 【发布时间】:2011-02-19 04:49:32 【问题描述】:我收到这两个警告(在 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::'
/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 等)编译了相同的代码,并且从未收到任何关于此代码的警告。
【问题讨论】:
<anonymous>
是什么字段?请贴出本地课堂的内容。
好的,这就是完整的结构(没有代码)。
【参考方案1】:
要解决此问题,请尝试以下方法之一。
像这样使用#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。
【讨论】:
就我而言,我需要struct __attribute__ ((visibility("hidden"))) StructName....;
【参考方案2】:
共享库似乎有问题。我假设您正在编写一个共享库。看this explanation。尝试添加命令行选项-fvisibility-inlines-hidden
。问题似乎是,gcc 尝试导出 MainLockDetector
的一些符号(链接可执行文件和库可见),而 Action
未导出(链接可执行文件和库不可见)。所以MainLockDetector
的知名度确实比Action
的知名度高。
【讨论】:
不,它不是一个共享库,它只是一个应用程序。但是为什么 MainLockDetector 是导出的而 Action 不是呢? 您阅读过链接的论文吗?有趣的部分在第 2.2.4 节中。 好的,现在已经阅读了(除了 2.2.4 和更多,大部分是 2.*)。非常有意思。但是-fvisibility-inlines-hidden
与我的问题有关吗?因为我没有明确地将 startMainLockDetector 声明为内联。另外,为什么它不导出Action?据我了解论文,一切都应该默认导出,那为什么不Action呢?
我对可见性的东西有点困惑。我制定了一个单独的问题here。也许这也会澄清这里的事情。
您能否告诉我们,可见性属性的更改是否有帮助?【参考方案3】:
这是因为您忘记将继承声明为 public。
struct MainLockDetector : public Action
bool wait(Uint32 time) /* ... */
int handle() /* ... */
;
这会导致“Action”成员为私有。但是,您刚刚将 Action 私有成员覆盖为公共(结构中的公共默认值),这可能会破坏封装,因此会发出警告。
【讨论】:
这对我来说毫无意义。正如您所说的“结构中的公共默认值”,所以“公共”是可选的(它是成员和继承的默认值)。 没有变化,仍然是同样的警告。 'public' 对结构也没有意义。 声明继承public
与这个问题没有任何关系。以上是关于C++:警告:“...”声明的可见性高于其字段“...::<anonymous>”的类型的主要内容,如果未能解决你的问题,请参考以下文章