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 等)编译了相同的代码,并且从未收到任何关于此代码的警告。

【问题讨论】:

&lt;anonymous&gt;是什么字段?请贴出本地课堂的内容。 好的,这就是完整的结构(没有代码)。 【参考方案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>”的类型的主要内容,如果未能解决你的问题,请参考以下文章

警告:XXXX 在 YYYY 中具有不同的可见性(默认)和在 ZZZZ 中(隐藏)

Java中同步的可见性效果

Go语言之标志符可见性

符号可见性、异常、运行时错误

Kotlin:为什么构造函数参数默认具有“内部”可见性?

符号可见性和 gcc 警告