2011-09-07 114 views
4

我仍然对Objective-C中的#import语句感到困惑。我有一个头文件(Common.h),其中包含一些在整个应用程序中使用的常量NSString。到目前为止,我在2班使用#import "Common.h",我也得到一个编译错误:Objective-C#import混淆

duplicate symbol _EX_XML_URL in /Users/username/Library/Developer/Xcode/DerivedData/projectname-ffvcivanbwwtrudifbcjntmoopbo/Build/Intermediates/projectname.build/Debug-iphonesimulator/projectname.build/Objects-normal/i386/NewsView.o and /Users/username/Library/Developer/Xcode/DerivedData/projectname-ffvcivanbwwtrudifbcjntmoopbo/Build/Intermediates/projectname.build/Debug-iphonesimulator/projectname.build/Objects-normal/i386/ViewController.o for architecture i386 

EX_XML_URL声明如下:

// 
    // Common.h 
    // Group of common constants used through out the application 

    /* 
    * Constant strings available to application 
    */ 

    #import <Foundation/NSString.h> 

    NSString* EX_XML_URL = @"http://myurl.com/xmldata"; // URL for XML data 
    NSString* EX_NO_CONNECTION = @"Network not availble";       
    NSString* EX_DEFAULT_IMAGE = @"logo.png"; 

我的印象(from this post)根据该#import后卫对抗的头文件被包括两次。我在这里想念什么?

+1

''import''可以防止头文件在同一个实现文件***中包含两次***。它消除了对C头文件熟悉的'#IFNDEF'逻辑的需求。 –

回答

6

在你的头文件(.h),你应该只声明的常数,那么你应该定义不断,并指定在您的实现(.M)文件中的值。

在COMMON.H

在Common.m

extern NSString *const EX_XML_URL; 

NSString *const EX_XML_URL = @"http://myurl.com/xmldata"; 


也没关系,如果你在Common.m拥有的唯一的事情是不变的定义,如果是这样的东西的工作方式出。只要确保Common.m包含在已编译并链接到目标文件中。

+0

荣誉,以及对** NSGod **的赞扬,他在我编辑我的答案时发布了代码行。干得好,先生。 –

4

你要字符串分割成2个文件,其中之一的extern声明它们在头文件,另一个实际包含文字:

.H

extern NSString * const EX_XML_URL; 

.M

NSString * const EX_XML_URL = @"http://myurl.com/xmldata";