所以問題來了。我準備儘快爲iOS發佈更新,以解決iOS 7中的一些問題。爲此,我需要使用一些特定的iOS 7功能/類型。我已經絕對確信,iOS 7代碼只能在iOS 7上執行,並且會在iOS 7之前回退到不同的代碼。當然,我不允許使用當前的Xcode測試版進行提交,因此我試圖編譯與當前的Xcode版本。不過,我似乎無法找到一個方法來禁用此特定的警告:編譯器的條件隱藏代碼
Use of undeclared identifier '<Redacted>'.
有誰知道的方式使用#pragma
禁用此警告。我已經嘗試了很多不同的人,包括
-w
,-Weverthing
,-Wall
,但似乎沒有任何工作。
UPDATE 回答:你當然不能,因爲編譯器不能編譯一個它一無所知的標識符。我的解決方案是簡單地創建一個#define
:
#define <redacted> 1
更新2 下面實際上使人們更容易的答案。我已經創建了#define Xcode5Code(code, alt)
,它允許我有條件地執行代碼塊。通過使用由@maddy解決方案修改它:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
#define Xcode5Code(code, alt) code
#else
#define Xcode5Code(code, alt) alt
#endif
這讓我很容易地通過使用隱藏的來自編譯器的代碼塊:
Xcode5Code({
//Code to be execute only with Xcode 5
}, {
//code to be executed in previous versions of Xcode
})
使用#define Xcode5Code
的主要好處是,Xcode中會自動爲您完成,這比使用完整的#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
更容易,Xcode不會自動完成。
這實際上並不能區分iOS 7和iOS 7之前的設備。它只區分當前Xcode可以處理的iOS版本。區分我使用的iOS設備版本:
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;
}
上面是Apple的代碼,順便說一下。爲了在NDA上跳舞,我會說這有助於展示根控制器的視圖,因爲這取決於您使用的Xcode版本和設備上的iOS版本。如果你試圖管理測試版和生產代碼,這可以幫助很多。一旦您可以使用Xcode 5提交應用程序,則不再需要#define Xcode5Code
。
這不是一個警告,這是一個錯誤。你希望編譯器如何操作一個它不知道的標識符? – Mat
這是一個警告嗎?看起來更像是一個錯誤。 – trojanfoe
@Mat啊......當然是啊。顯然我今天需要更多咖啡。是的,這是一個錯誤,當然我不能指望編譯器編譯一些它一無所知的東西。 –