#import仍会出现“重复符号”错误
当我编译我的iPhone应用程序时,xCode为MyConstants.h中的变量提供了“重复符号”错误
我想如果我用过:
#import "MyConstants.h"
它会避免这种情况吗?
但我仍然有问题。
补充信息:
也许我应该问这个:
如果您需要在所有源代码文件的每个部分中访问常量…您将在.h文件中放置什么? 您将使用什么将该常量包含在代码的其他部分中。
我想(但我猜它不是)它很简单:
(不管我在哪里,我都会在任何代码中的任何地方重新定义thisIsGlobal。)
然后在我的其他每个源文件的顶部只添加“#import MyConstants.h”。
您可以做的是放入标题( MyConstants.h
):
extern const int MyConstant; extern NSString * const MyStringConstant;
在源文件中,包含上面的标题但定义常量( MyConstants.m
):
const int MyConstant = 123; NSString * const MyStringConstant = @"SomeString";
然后,您只需要将标头包含在使用这些常量中的任何一个的任何其他源文件中。 标题只是声明这些常量存在于某处,因此编译器不会抱怨,因为解析这些常量名称是链接器的工作。 包含常量定义的源文件将被编译,链接器会看到这是常量所在的位置,并解析在其他源文件中找到的所有引用。
在标头中声明和定义常量(未声明为static
)的问题是编译器将其视为包含该标头的每个文件的独立全局。 当链接器尝试将所有已编译的源链接在一起时,它会遇到包含MyConstants.h
的全局名称。
两种选择:
static const int thisIsGlobal = 123;
要么
#define thisIsGlobal 123
我像这样使用,并且工作:(在@interface之外的.h中)
static NSString * const mkLocaleIdentifierUS = @"en_US"; static NSString * const mkLocaleUserSystemSettings = nil;
这是因为有问题的符号名称(thisIsGlobal)被发送到创建的每个目标文件中,其中包含thisIsGlobal声明的标题是可见的。
另一张海报提供的例子:’extern const int MyConstant;’ 是最好的方法,除非你需要值可见,在这种情况下你可以使用枚举:
int thisIsGlobal = 123; //糟糕
enum {thisIsGlobal = 123}; // 好
使用static会在大型程序中发出大量隐藏符号 – 请勿使用它。 使用定义也是可怕的(考虑到有更安全的替代品,为什么不使用它们?)。
我通常将我的应用程序常量文件放在Xcode项目的MyApplication_Prefix.pch
文件中,该文件通常位于Other Sources
组中。 此pch
文件中包含的任何头文件都将包含在项目的所有文件中。
添加此include语句后,您将不再需要在项目的每个文件中包含MyConstants.h
文件 – 它将自动包含在内。