14

クラスのヘッダーで、インターフェイス宣言の外で、グローバル定数を宣言しました。

NSString * const gotFilePathNotification = @"gotFilePath";
NSString * const gotResultNotification = @"gotResultOfType";

gotResultNotificationは(まだ)このクラスでのみ使用されますが、別のクラス実装でgotFilePathNotificaionを参照しています。そのために、このヘッダーをインポートします。

コンパイルしようとすると、このヘッダーのgotFilePathNotificationに関する重複シンボルリンカーエラーが発生します。なぜそれが起こるのですか?

4

3 に答える 3

26

ファイルスコープの2つの異なるコンパイルユニットに同じ名前の2つの識別子があります。これは、単一定義規則に違反します。代わりに-する必要があります

  1. ヘッダーファイルで外部リンケージを持つようにグローバル変数マーキングを宣言します。

    extern NSString * const gotFilePathNotification;
    
  2. ここで、 1つのソースファイルのみで定義を提供します。

    NSString * const gotFilePathNotification = @"gotFilePath";
    

これらの変数を使用する必要がある場合は、ソースファイルにヘッダーを含めます。

于 2012-06-08T23:39:29.157 に答える
5

それらをヘッダーファイルでexternとして宣言し、実装ファイルで定義する必要があります。明確にするためにこの質問を参照してください。 Cocoa / Objective-Cのグローバル変数?

2番目の応答は、ここで繰り返すことを明確にします。変数のデフォルトのストレージ修飾子は静的です。これは、ヘッダーファイルをインポートするときに発生するように、同じ変数で2つの異なるファイルをリンクしようとすると、リンカーは変数が複数定義されていると解釈することを意味します。

于 2012-06-08T23:34:22.513 に答える
4

また、mファイルではなくhファイルが含まれていることを確認してください。これは私を狂わせていました。

于 2014-03-27T20:37:12.697 に答える