8

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

4

3 回答 3

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。

有关更多详细信息,请参阅http://gcc.gnu.org/wiki/Visibility

于 2010-07-03T03:06:13.743 回答
1

共享库似乎有问题。我假设您正在编写一个共享库。看看这个解释。尝试添加命令行选项-fvisibility-inlines-hidden。问题似乎是,gcc 尝试导出一些符号MainLockDetector(对链接可执行文件和库可见),Action而未导出(对链接可执行文件和库不可见)。所以MainLockDetector真正的能见度要高于 的能见度Action

于 2010-05-14T21:19:13.227 回答
-5

这是因为您忘记将继承声明为公共的。

    struct MainLockDetector : public Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };

这会导致“Action”成员是私有的。但是,您刚刚将 Action 私有成员覆盖为公共(结构中的公共默认值),这可能会破坏封装,因此会发出警告。

于 2010-05-13T17:33:24.693 回答