当我编译我的iPhone应用程序时,xCode在MyConstants.h中为我的变量提供了“重复符号”错误
我想如果我用过:
#import "MyConstants.h"
会避免这种情况吗?
但我仍有问题。
添加信息:
也许我应该问这个:
如果您需要访问所有部分 ALL 源代码文件中的常量...您将在.h文件中添加什么内容?您将使用什么来将该常量包含在代码的其他部分中。
我想(但我猜它不是)它很简单:
(不管我在任何代码的任何地方重新定义thisIsGlobal。)
然后在我的其他每个源文件的顶部只添加“#import MyConstants.h”。
答案 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
文件 - 它将自动包含在内。