[英]Xcode12 compile error against Cocos3D: Incompatible block pointer types
“Xcode 12.0 (12A7209)”在以下代碼中顯示針對 Cocos3D 庫(用 Objective-C 編寫)的編譯錯誤:
(過去的 Xcode 版本((即 ver.11、10),包括 ver 11.7(11801a))沒有這個問題,但 Xcode 12.0 有。)
錯誤信息:
不兼容的塊指針類型將“void (^)(CC3ShaderProgram *, BOOL *)”發送到“void (^)(id, BOOL *)”類型的參數
// CC3Shaders.m
+(void) willBeginDrawingScene {
[_programCache enumerateObjectsUsingBlock: ^(CC3ShaderProgram* prog, BOOL* stop) {
[prog willBeginDrawingScene];
}];
}
// CC3Cache.m
-(void) enumerateObjectsUsingBlock: (void (^) (id<CC3Cacheable> obj, BOOL* stop)) block {
[self lock];
[_objectsByName enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL* stop) {
block([obj resolveWeakReference], stop);
}];
[self unlock];
}
基本上,Xcode 12.0 的 ObjC 編譯器抱怨塊“enumerateObjectsUsingBlock:”的輸入參數的對象類型不匹配。
但是“CC3ShaderProgram”是從“NSObject with CC3Cacheable protocol”繼承而來的,如下所示:
@interface CC3ShaderProgram : CC3Identifiable
@interface CC3Identifiable : NSObject <CC3Cacheable, NSCopying>
因此,“CC3ShaderProgram”是與“id”匹配的類型,因此編譯器不應抱怨,但 Xcode12.0 會。
不僅在“willBeginDrawingScene”,而且在庫中使用“enumerateObjectsUsingBlock:”的其他地方也有同樣的問題。
過去幾年我一直在使用 Cocos3D 庫和幾個不同版本的 Xcode,沒有這個問題。
“Xcode 12.0”的 CLANG 或 SDK 中是否有任何更改以在塊參數類型檢查方面變得更嚴格(例如“不允許使用通用對象指針“id””)? 否則,我不明白為什么這兩種匹配類型被編譯器視為不匹配類型並導致 Xcode 12.0 中的編譯錯誤。
您能否為此提供任何好的解決方案? 將不勝感激。
謝謝你。
更新:更改參數類型以在塊中包含“NSCopying”協議(使參數類型的協議設置為與“CC3ShaderProgram”相同)后,Xcode12 編譯器已停止抱怨。 (以前,只包含 CC3Cacheable 協議。)
-(void) enumerateObjectsUsingBlock: (void (^) (id<CC3Cacheable, NSCopying> obj, BOOL* stop)) block
目前,代碼二進制構建沒有這個編譯錯誤。 但是,我仍然不明白為什么 Xcode 12.0 會抱怨這一點,除非 Xcode12 的 CLANG 在類型檢查方面變得比以前的版本嚴格得多。
在 Cocos3D 中有兩種方法可以解決這個問題。
它可以在CC3Cache.h
中的代碼中CC3Cache.h
,通過將__kindof
添加到[CC3Cache enumerateObjectsUsingBlock:]
的定義中,如下所示:
-(void) enumerateObjectsUsingBlock: (void (^) (__kindof id<CC3Cacheable> obj, BOOL* stop)) block;
這是應該修復的地方。
或者,可以在構建時消除錯誤,無需更改代碼,包括:
-Xclang -fcompatibility-qualified-id-block-type-checking
在OTHER_CFLAGS
構建設置中。
編輯清理了一下
嘗試添加
-Wno-incompatible-pointer-types
到您的編譯器標志( Build Settings > Apple Clang > Custom Compiler Flags > Other Warning Flags )。 這是最好且非常有用的選項,因為它可以消除這種經常令人討厭的警告。
在 Xcode 中,有一個選項,在Build Settings > Apple Clang > Warnings > Alllanguages下,您會發現Treat incompatible pointer types as warnings 。 但這並沒有使其靜音,而是在警告或錯誤之間切換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.