8

次の 2 つの警告が表示されます (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() { /* ... */ }
    };

これにより、「アクション」メンバーが非公開になります。ただし、アクションのプライベート メンバーをパブリック (構造体のパブリック デフォルト) としてオーバーライドしたところ、カプセル化が壊れる可能性があるため、警告が表示されます。

于 2010-05-13T17:33:24.693 に答える