重复符号错误——全局常量

14
在类的头部、接口声明之外,我声明了全局常量:
NSString * const gotFilePathNotification = @"gotFilePath";
NSString * const gotResultNotification = @"gotResultOfType";

gotResultNotification仅在这个类中使用,但我在另一个类的实现中引用了gotFilePathNotificaion。为此,我导入了这个头文件。

当我尝试编译时,我会得到一个关于这个头文件中gotFilePathNotification的重复符号链接器错误。为什么会发生这种情况?

3个回答

26

您在文件作用域内有两个名称相同的标识符,跨越了两个不同的编译单元。这违反了一个定义规则。您需要进行以下操作 -

  1. Declare the global variables marking to have external linkage in a header file.

    extern NSString * const gotFilePathNotification;
    
  2. Now provide the definition in only one source file.

    NSString * const gotFilePathNotification = @"gotFilePath";
    
现在无论何处需要使用这些变量,在源文件中都要包含头文件。

5
您需要在头文件中声明它们为extern,在实现文件中定义它们。有关澄清,请参见此问题。 Cocoa/Objective-C中的全局变量?
第二个响应提供了我将在此重申的澄清。 变量的默认存储限定符是static。 这意味着当您导入头文件时,尝试链接具有相同变量的两个不同文件时,链接器将解释该变量被多次定义。

默认的存储限定符不是静态的。如果是静态的话,那么就不会出现链接错误。静态变量具有内部链接性。因此,如果两个翻译单元都使用相同标识符定义了一个静态变量,则它们各自拥有一个单独的变量。 - Ken Thomases

4

还要确保您包含的是.h文件而不是.m文件。这让我感到非常困扰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接