C ++:警告:'...'声明的可见性高于其字段的类型'... :: <anonymous>'</anonymous>

时间:2010-05-13 17:04:51

标签: c++ gcc visibility warnings gcc-warning

我收到了这两个警告(在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 ::&lt; anonymous&gt;'

的类型

/ 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等)编译了相同的代码,并且从未对此代码发出任何警告。

3 个答案:

答案 0 :(得分:4)

要解决此问题,请尝试以下方法之一。

  1. 像这样使用#pragma GCC visibility push()语句。

    #pragma GCC visibility push(hidden)
    struct MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };
    #pragma GCC visibility pop
    
  2. 像这样使用__attribute__ ((visibility("hidden")))

    struct __attribute__ ((visibility("hidden"))) MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };
    
  3. 添加命令行选项-fvisibility = default。

  4. 有关详细信息,请参阅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(结构中的公共默认值),这可能会破坏封装,从而导致警告。