2012-06-08 16 views
13

Trong phần đầu của lớp, ngoài tuyên bố giao diện, tôi đã tuyên bố hằng toàn cầu:Duplicate lỗi biểu tượng - toàn cầu liên tục

NSString * const gotFilePathNotification = @"gotFilePath"; 
NSString * const gotResultNotification = @"gotResultOfType"; 

gotResultNotification chỉ được sử dụng trong lớp này (chưa), nhưng tôi tham khảo gotFilePathNotificaion trong một lớp thực hiện khác. Để làm điều đó, tôi nhập tiêu đề này.

Khi tôi cố gắng biên dịch, tôi nhận được lỗi liên kết biểu tượng trùng lặp về gotFilePathNotification trong tiêu đề này. Tại sao nó lại xảy ra?

Trả lời

26

Bạn có hai số nhận dạng có cùng tên trên hai đơn vị biên dịch khác nhau ở phạm vi tệp. Điều này vi phạm . Thay vào đó, bạn cần phải -

  1. Tuyên bố các biến toàn cầu đánh dấu để có liên kết bên ngoài trong tệp tiêu đề.

    extern NSString * const gotFilePathNotification; 
    
  2. Bây giờ cung cấp các định nghĩa trong chỉ một file nguồn.

    NSString * const gotFilePathNotification = @"gotFilePath"; 
    

Bây giờ có bao giờ bạn cần phải sử dụng các biến này, bao gồm tiêu đề trong file nguồn.

5

Bạn cần khai báo chúng bên ngoài trong tệp tiêu đề và xác định chúng trong tệp triển khai. Xem câu hỏi này để làm rõ. Global Variables in Cocoa/Objective-C?.

Phản hồi thứ hai cung cấp giải thích rằng tôi sẽ nhắc lại ở đây. Bộ định danh lưu trữ mặc định cho các biến là tĩnh. Điều này có nghĩa là khi bạn cố liên kết hai tệp khác nhau với cùng một biến, như sẽ xảy ra khi bạn nhập tệp tiêu đề của mình, trình liên kết sẽ hiểu rằng biến được nhân xác định.

+0

Trình độ lưu trữ mặc định là ** không ** tĩnh. Nếu có, thì bạn sẽ không có lỗi liên kết. Biến tĩnh có liên kết nội bộ. Vì vậy, nếu hai đơn vị dịch cả xác định một biến tĩnh với cùng một số nhận dạng, thì mỗi đơn vị dịch đều có một biến riêng biệt. –

4

Cũng đảm bảo bạn bao gồm tệp h chứ không phải tệp m. Điều này đã khiến tôi khốn khổ.