在类的标题中,在接口声明之外,我已经声明了全局常量:
NSString * const gotFilePathNotification = @"gotFilePath";
NSString * const gotResultNotification = @"gotResultOfType";
gotResultNotification仅在此类中使用(但),但我在另一个类实现中引用了gotFilePathNotificaion。为此,我导入了这个标题。
当我尝试编译时,我在此标头中收到有关gotFilePathNotification的重复符号链接器错误。为什么会这样?
答案 0 :(得分:26)
在文件范围内的两个不同编译单元中,您有两个具有相同名称的标识符。这违反了One Definition Rule。相反,你需要 -
声明全局变量标记在头文件中具有外部链接。
extern NSString * const gotFilePathNotification;
现在在仅一个源文件中提供定义。
NSString * const gotFilePathNotification = @"gotFilePath";
现在您需要使用这些变量,请在源文件中包含标题。
答案 1 :(得分:5)
您需要在头文件中声明它们extern并在实现文件中定义它们。请参阅此问题以获得澄清。 Global Variables in Cocoa/Objective-C?。
第二个回复提供了我将在此重申的澄清。变量的默认存储限定符是静态的。这意味着当您尝试使用相同的变量链接两个不同的文件时,就像导入头文件时一样,链接器将解释该变量是多重定义的。
答案 2 :(得分:4)
还要确保包含h文件而不是m文件。这让我疯了。