2012-03-06 15 views
15

Tôi đã xác định một NSString để sử dụng làm miền lỗi trong NSError và đã sao chép ASIHttpRequest đang hoạt động như thế nào.ld: biểu tượng trùng lặp - do const

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

tôi đặt const trong file .h riêng của mình // FPServerAPICoordinatorConstants.h

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h 
#define FirePlayer_FPServerAPICoordinatorConstants_h 

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

#endif 

nhưng khi tôi đưa nó vào nhiều hơn một .m

SomeFile.m 

#import "FPServerAPICoordinatorConstants.h" 

SomeOtherFile.m 

#import "FPServerAPICoordinatorConstants.h" 

tôi lỗi liên kết 'biểu tượng trùng lặp'

ld: duplicate symbol _FPServerAPIErrorDomain in SomeFile.o and ....SomeOtherFile.o for architecture armv7 

vì vậy tôi thay đổi const thành #define và nó hoạt động tốt.

// FPServerAPICoordinatorConstants.h 

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h 
#define FirePlayer_FPServerAPICoordinatorConstants_h 


//THIS WAS TRIGGERING link errors 
//NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 
//working OK 
#define FPServerAPIErrorDomain @"FPServerAPIErrorDomain" 

#endif 

Nhưng có cách nào để có được const trong không gian toàn cầu không ném 'biểu tượng trùng lặp' không?

+2

nếu bạn bỏ qua ma thuật bao gồm tệp, là câu hỏi của bạn giống như: "tôi có thể làm ** const int i = 42; ** hai lần trong cùng một nguồn/nhị phân không? –

+0

có nhưng cũng 'cách bạn KHÔNG sử dụng #defines và sử dụng const trong không gian toàn cầu 'là nó có thể? nó được ưa thích? #define hoạt động nhưng tại sao có consts sau đó? Im một người java chuyển vào Obj-c Tôi havent đủ điều kiện trong voodoo 101 chưa –

+0

Bạn chưa sao chép những gì ASIHttpRequest đang làm ở tất cả quay trở lại và nhìn lại – hooleyhoop

Trả lời

47

Trong tập tin tiêu đề của bạn, bạn muốn:

extern NSString *const FPServerAPIErrorDomain; 

và sau đó trong một tập tin thực thi (như vậy có lẽ bạn muốn có một FPServerAPICoordinatorConstants.m), bạn sẽ muốn:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

Sau đó, bạn có thể nhập tiêu đề vào nhiều tệp và không bị lỗi biểu tượng trùng lặp.

[Bằng cách này, bạn không cần #ifndef bảo vệ nếu bạn đang sử dụng #import.]

+0

ha ap! ple đặt ifndef trong :) khi tôi thêm tệp tiêu đề từ các mẫu –

+0

Đó có thể là do bạn đã thêm từ mẫu "tiêu đề C".Điều đó sẽ có chúng theo mặc định vì bạn sẽ muốn chúng nếu bạn sử dụng kiểu '' include '. Nhưng bạn đang dùng Objective-C-style '# import'. Vì vậy, loại bỏ các vệ sĩ. – mattjgalloway

+0

Cảm ơn rất nhiều vì câu trả lời của bạn. Tiết kiệm thời gian cho tôi. – Yanhua

3

Không thể tạo biến tương tự (chung) hai lần trong cùng một không gian tên (mà không gặp lỗi).

+1

là có bất kỳ lợi thế của việc sử dụng // NSString * const FPServerAPIErrorDomain = @ "FPServerAPIErrorDomain";.. qua #define FPServerAPIErrorDomain @ "FPServerAPIErrorDomain" –

1

Mỗi biểu tượng chỉ cần được xác định một lần; nghĩa là, nó chỉ nên được định nghĩa trong một tệp m. Bằng cách đặt định nghĩa trong một tệp tiêu đề, nó được định nghĩa trong mỗi tệp m bao gồm tiêu đề đó.

Xác định nó trong một trong các tệp m của bạn (tùy theo điều kiện nào phù hợp nhất) và thay đổi những gì bạn có trong tiêu đề thành tuyên bố (sử dụng từ khóa bên ngoài).

Định nghĩa tạo không gian cho dữ liệu; tuyên bố đơn giản nói với trình biên dịch rằng có một định nghĩa ở một nơi khác. Vì vậy, mỗi tệp m sử dụng hằng số cần phải có một khai báo, nhưng chỉ một tệp m phải có định nghĩa.

+0

có lợi thế nào khi sử dụng // NSString * const FPServerAPIErrorDomain = @ "FPServerAPIErrorDomain"; trên #define FPServerAPIErrorDomain @ "FPServerAPIErrorDomain" –