2011-07-15 17 views
32

Tôi hiện đang sử dụng Xcode 4 và trong tệp .pch của tôi, tôi có macro này: #define localize(s) NSLocalizedString((s), nil).
Khi tôi cố gắng sử dụng macro này trong một số tệp .m, tôi nhận được cảnh báo này: Implicit declaration of function 'localize' is invalid in C99.Khai báo ngầm định hàm - C99

Mã này biên dịch mà không có sự cố, nhưng làm cách nào để khắc phục sự cố này để tôi không nhận được cảnh báo?

+0

Tôi không thể tạo lại vấn đề, nó biên dịch và chạy tốt, không có cảnh báo. – Lio

+0

Có vẻ như đó là một lỗi trong XCode ... 4.0.2 Tôi nghĩ vậy. 4.2 betas làm việc tốt. – Misa

Trả lời

34

Khai báo chức năng ngầm là các trình biên dịch nhìn thấy lần đầu tiên được sử dụng như một cuộc gọi hàm (trái ngược với những gì mà nguyên mẫu hoặc định nghĩa hàm được nhìn thấy trước).

Dường như mã của bạn đã sử dụng localize(foo) nhưng định nghĩa macro không hiển thị. Lý do có thể xảy ra: bạn quên #include tệp chứa macro bản địa hóa hoặc phần biên dịch trước của tiêu đề đi về phía nam không bao gồm macro localize do đó nó không được mở rộng.

+3

Nhưng điều đó sẽ chỉ ra một lỗi trong Xcode, nếu macro được xác định trong tiêu đề tiền tố của dự án, vì tiêu đề đó phải được biên dịch trước và sẵn có cho tất cả các đơn vị biên dịch (ví dụ: mọi tệp .m trong dự án). FWIW Tôi vẫn thấy lỗi này đôi khi trong Xcode 4.4.1, nhưng bỏ và khởi chạy lại Xcode để sửa lỗi đó. – Mason

+2

Điều đó có thể được đệ trình dưới 'biên dịch trước các tiêu đề đi về phía nam'. Với lỗi trong công cụ, mọi thứ đều có thể xảy ra. – Jens

+0

Tôi đã thấy điều này xảy ra trong Xcode 5. Cách an toàn nhất để loại bỏ thông báo cảnh báo là chỉ cần bao gồm tệp tiêu đề có liên quan bên trong tệp hiển thị lỗi. – JaredH

50

Tôi gặp sự cố này khi tôi thay thế NSLog bằng DLog toàn cầu. Tôi dại dột bao gồm

#define DLog(...) NSLog(... 

báo cáo, vì vậy tôi đã kết thúc với

#define DLog(...) DLog(... 

mà gây ra cảnh báo, và một lỗi mối liên kết.

2

Sai lầm "ngu ngốc" khác mà tôi gặp phải là thực tế DLog của tôi đã được xác định trong tiêu đề tiền tố của mục tiêu iOS, vì vậy tôi phải sao chép nó sang tiền tố của mục tiêu OSX, ...

1

tôi có vấn đề này bởi vì tôi vô tình nhập khẩu CocoaLumberjack như thế này:

#import <CocoaLumberjack/DDLog.h> 

Rõ ràng đội CocoaLumberjack Modularized mã một số chi tiết; và các macro như DDLogError hiện được định nghĩa riêng trong tệp tiêu đề của riêng chúng.

tôi thay thế báo cáo kết quả nhập khẩu với điều này và lỗi ra đi:

#import <CocoaLumberjack/CocoaLumberjack.h> 
1

Trong trường hợp của tôi chỉ có một tập tin được đưa ra lỗi này. Hóa ra là tôi đã thêm nó vào thành viên mục tiêu thử nghiệm của dự án (trong Thanh tra tập tin ở bên phải).