重复的符号错误 - 全局常量

时间:2012-06-08 23:30:17

标签: objective-c linker compiler-errors const

在类的标题中,在接口声明之外,我已经声明了全局常量:

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

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

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

3 个答案:

答案 0 :(得分:26)

在文件范围内的两个不同编译单元中,您有两个具有相同名称的标识符。这违反了One Definition Rule。相反,你需要 -

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

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

    NSString * const gotFilePathNotification = @"gotFilePath";
    
  3. 现在您需要使用这些变量,请在源文件中包含标题。

答案 1 :(得分:5)

您需要在头文件中声明它们extern并在实现文件中定义它们。请参阅此问题以获得澄清。 Global Variables in Cocoa/Objective-C?

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

答案 2 :(得分:4)

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