0

私の Xcode プロジェクトでは、次の C ユーティリティ関数を使用してスタンドアロンのヘッダー ファイルを作成しました。

#ifndef FOO
#define FOO
CGFloat DistanceBetweenTwoPoints(CGPoint p1, CGPoint p2)
{
    CGFloat dx = p2.x - p1.x;
    CGFloat dy = p2.y - p1.y;
    return sqrt(dx*dx + dy*dy);
};
#endif

プリプロセッサ ディレクティブを使用しても、ヘッダー ファイルを複数の場所に配置しようとすると、importシンボルincludeの重複に関する次のエラーが表示されます。

linker command failed with exit code 1

この効果を達成する別の方法はありますか? この質問は何よりも好奇心からです。

ありがとう

4

2 に答える 2

1

関数の定義はヘッダーにあるため、関数が含まれている各ファイル(実際には各変換単位)で関数の定義を1つ取得します。

関数本体を「.c」ファイルに移動し、ヘッダーに宣言を残すか、宣言しinlineます。

于 2012-10-08T13:34:36.473 に答える
1

関数本体を.cファイルに入れ、関数宣言 (別名プロトタイプ).hをそれら#ifndefの などに入れます。次に、 を使用includeして、関数が必要な場所にヘッダー ファイルをインポートします。

ファイルのターゲット メンバーシップを確認することを忘れないでください.c。そうしないと、コンパイルされません。

そのような小さな関数の場合は、それを宣言しinlineてヘッダー ファイルを使用するだけです。

inline CGFloat DistanceBetweenTwoPoints(CGPoint p1, CGPoint p2)
{
    // code as is
}

コンパイラは、新しいオブジェクト ファイルを実際に構築してリンクすることなく、関数呼び出しを関数コードに置き換えます。シンボルの重複はもうありません。

于 2012-10-08T13:35:39.200 に答える