2

デモプロジェクトに次のようなインクルードガードを備えたファイルiforce2d_topdown_car.hがあります。

#ifndef IFORCE2D_TOPDOWN_CAR_H
#define IFORCE2D_TOPDOWN_CAR_H

... source code ...

#endif

これはHelloWorldLayer.hに含まれ、その後、他の2つのファイルに含まれます(これは、iforce2dヘッダーを除くすべてのobj-cです)。すべてが正常にコンパイルされますが、発生したエラーは3回表示されます。これは私を苛立たせます、そしてそれがより大きな問題の兆候であるかどうか疑問に思います。

xcodeのヘッダーファンキーネス

これは予想される動作ですか?プリプロセッサ変数が定義されている場合、それは定義されたままであり、次に含まれるときにコンパイルされないように思われます。ここではそうではないようですが、理由はわかりません。

4

1 に答える 1

3

これTDCar(b2World *)は、クラス定義内で定義されているため、インラインメンバー関数です。つまり、コンパイラは関数をインスタンス化し、この関数を呼び出すすべての変換ユニットで対応する警告を発行します。

あなたが次のものを持っていると想像してみましょうA.h

クラスA{
公衆:
    int f(int i);
};

A.cpp

int A :: f(int i){
    int j = i;
    i+1を返します。
}

コンパイラは関数A::f(int i)を1回コンパイルしてエクスポートするため、その関数を呼び出すたびにエクスポートされたシンボルにリンクされます。したがって、未使用の変数に対する警告は、コンパイルj時に1回発行されます。A.cpp

しかし、あなたが次のように書くならA.h

クラスA{
公衆:
    int f(int i){
        int j = i;
        i+1を返します。
    }
};

次に、コンパイラは、関数定義から関数を呼び出すソースコードファイルにコードを直接コピーします。その関数を3つの異なるファイルで使用すると、関数は3回コンパイルされ、警告が3回発行されます。

各ファイルは個別にコンパイルされるため、コンパイラーは、別のファイルに対して警告がすでに発行されていることを知ることができません。

Xcodeは、3つの警告が同じであると認識し、それらを集約して1つの警告のみを受け取るのに十分賢いはずです。残念ながら、Xcodeはそれほど賢くはありません。

于 2012-07-11T17:38:01.587 に答える