14

在类的头文件中,在接口声明之外,我声明了全局常量:

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

gotResultNotification 仅在此类中使用(还),但我在另一个类实现中引用了 gotFilePathNotificaion。为此,我导入了此标头。

当我尝试编译时,我在此标头中收到有关 gotFilePathNotification 的重复符号链接器错误。为什么会这样?

4

3 回答 3

26

您在文件范围内的两个不同编译单元中有两个同名的标识符。这违反了一个定义规则。相反,您需要 -

  1. 在头文件中声明全局变量标记以具有外部链接。

    extern NSString * const gotFilePathNotification;
    
  2. 现在在一个源文件中提供定义。

    NSString * const gotFilePathNotification = @"gotFilePath";
    

现在,无论您需要在哪里使用这些变量,都可以在源文件中包含标头。

于 2012-06-08T23:39:29.157 回答
5

您需要在头文件中声明它们 extern 并在实现文件中定义它们。请参阅此问题以进行澄清。 Cocoa/Objective-C 中的全局变量?.

第二个答复提供了我将在此重申的澄清。变量的默认存储限定符是静态的。这意味着当您尝试使用相同的变量链接两个不同的文件时,正如您导入头文件时会发生的那样,链接器将解释该变量是多重定义的。

于 2012-06-08T23:34:22.513 回答
4

还要确保包含 h 文件而不是 m 文件。这让我发疯了。

于 2014-03-27T20:37:12.697 回答