#import仍会出现“重复符号”错误

时间:2010-05-02 17:16:57

标签: iphone c xcode import compiler-errors

当我编译我的iPhone应用程序时,xCode在MyConstants.h中为我的变量提供了“重复符号”错误

我想如果我用过:

#import "MyConstants.h"

会避免这种情况吗?

但我仍有问题。

添加信息:

  • “链接”期间发生错误。 (我只是使用xCode的“Build and Go”按钮。)

  • 我也尝试过(#import不需要)#ifndef / def方法。

    也许我应该问这个:

    如果您需要访问所有部分 ALL 源代码文件中的常量...您将在.h文件中添加什么内容?您将使用什么来将该常量包含在代码的其他部分中。

    我想(但我猜它不是)它很简单:

  • MyConstants.h> int thisIsGlobal = 123;

    (不管我在任何代码的任何地方重新定义thisIsGlobal。)

    然后在我的其他每个源文件的顶部只添加“#import MyConstants.h”。

  • 5 个答案:

    答案 0 :(得分:20)

    您可以做的是放入标题(MyConstants.h):

    extern const int MyConstant;
    extern NSString * const MyStringConstant;
    

    在源文件中,包含上面的标题但定义常量(MyConstants.m):

    const int MyConstant = 123;
    NSString * const MyStringConstant = @"SomeString";
    

    然后,您只需要将标头包含在使用这些常量之一的任何其他源文件中。标题只是声明这些常量存在于某处,因此编译器不会抱怨,因为链接器的工作就是解析这些常量名称。包含常量定义的源文件被编译,链接器看到这是常量所在的位置,并解析在其他源文件中找到的所有引用。

    在标头中声明和定义常量(未声明为static)的问题是编译器将其视为包含该标头的每个文件的独立全局。当链接器尝试将所有已编译的源链接在一起时,它会遇到包含MyConstants.h的全局名称的次数。

    答案 1 :(得分:8)

    两个选项:

    static const int thisIsGlobal = 123;
    

    #define thisIsGlobal 123
    

    答案 2 :(得分:5)

    我像这样使用,并且工作:(在@interface外面的.h)

    static NSString * const mkLocaleIdentifierUS = @"en_US";
    static NSString * const mkLocaleUserSystemSettings = nil;
    

    答案 3 :(得分:3)

    这是因为有问题的符号名称(thisIsGlobal)被发送到创建的每个目标文件中,其中包含thisIsGlobal声明的标题包含在内并且可见。

    另一张海报提供的例子:'extern const int MyConstant;'是最好的方法,除非你需要值可见,在这种情况下你可以使用枚举:

      

    int thisIsGlobal = 123; //糟糕

         

    enum {thisIsGlobal = 123}; //好的

    使用static会在大型程序中发出大量隐藏符号 - 请勿使用它。使用定义也是可怕的(考虑到有更安全的替代品,为什么不使用它们?)。

    答案 4 :(得分:2)

    我通常将我的应用程序常量文件放在Xcode项目的MyApplication_Prefix.pch文件中,该文件通常位于Other Sources组中。此pch文件中包含的任何头文件都将包含在项目中的所有文件中。

    添加此include语句后,您将不再需要在项目的每个文件中包含MyConstants.h文件 - 它将自动包含在内。