Vì vậy, đây là vấn đề. Tôi sẽ sớm phát hành bản cập nhật cho iOS sẽ giải quyết một số vấn đề trong iOS 7. Để thực hiện việc này, tôi cần sử dụng một số chức năng/loại iOS 7 cụ thể. Tôi đã hoàn toàn chắc chắn rằng mã iOS 7 sẽ chỉ được thực hiện trên iOS 7 và dự phòng với các mã khác nhau cho iOS trước 7. Tất nhiên, tôi không được phép gửi với phiên bản beta Xcode hiện tại, vì vậy tôi đang cố gắng biên dịch với bản phát hành Xcode hiện tại. Tuy nhiên, tôi dường như không thể tìm thấy một cách để vô hiệu hóa cảnh báo đặc biệt này:Điều kiện ẩn mã từ trình biên dịch
Use of undeclared identifier '<Redacted>'.
Có ai biết một cách để vô hiệu hóa cảnh báo này sử dụng một #pragma
. Tôi đã thử một bó của những người thân khác nhau bao gồm
-w
, -Weverthing
, -Wall
nhưng không có vẻ làm việc.
CẬP NHẬT Trả lời: Dĩ nhiên, bạn không thể biên dịch mã nhận dạng mà nó không biết gì cả. giải pháp của tôi là chỉ cần tạo một #define
:
#define <redacted> 1
UPDATE 2 Câu trả lời dưới đây thực sự đã làm cho nó dễ dàng hơn nhiều. Tôi đã tạo một #define Xcode5Code(code, alt)
cho phép tôi thực thi các khối mã có điều kiện. Bằng cách thay đổi nó bằng cách sử dụng giải pháp của @maddy:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
#define Xcode5Code(code, alt) code
#else
#define Xcode5Code(code, alt) alt
#endif
này cho phép tôi để dễ dàng ẩn các khối mã từ trình biên dịch bằng cách sử dụng:
Xcode5Code({
//Code to be execute only with Xcode 5
}, {
//code to be executed in previous versions of Xcode
})
Lợi ích chính của việc sử dụng các #define Xcode5Code
là Xcode rằng sẽ tự động hoàn thành nó cho bạn, dễ hơn rất nhiều so với việc sử dụng đầy đủ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
, mà Xcode sẽ không tự động hoàn thành.
Điều này sẽ không thực sự phân biệt giữa các thiết bị iOS 7 và iOS 7 trước. Nó chỉ phân biệt phiên bản iOS mà Xcode hiện tại có thể xử lý. Để phân biệt giữa các phiên bản thiết bị iOS tôi sử dụng:
NSUInteger DeviceSystemMajorVersion(void) {
static NSUInteger _deviceSystemMajorVersion = -1;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue];
});
return _deviceSystemMajorVersion;
}
Ở trên là mã của Apple, nhân tiện. Để nhảy xung quanh NDA một chút, tôi sẽ nói rằng điều này giúp với việc đặt ra khung nhìn của trình điều khiển gốc, bởi vì điều đó phụ thuộc vào cả phiên bản Xcode bạn đang sử dụng VÀ phiên bản iOS trên thiết bị. Và nếu bạn đang cố gắng quản lý mã beta cũng như mã sản xuất, điều này có thể giúp ích rất nhiều. Sau khi bạn có thể gửi ứng dụng bằng Xcode 5, #define Xcode5Code
sẽ không còn cần thiết nữa.
Đó không phải là cảnh báo, đó là lỗi. Làm thế nào để bạn muốn trình biên dịch thao tác một định danh mà nó không biết? – Mat
Đó có phải là cảnh báo không? Trông giống như một lỗi. – trojanfoe
@Mat Ah ... duh, tất nhiên rồi. Rõ ràng hôm nay tôi cần thêm cà phê. Có, đó là một lỗi và tất nhiên tôi không thể mong đợi trình biên dịch để biên dịch một cái gì đó nó không biết gì về. –