簡體   English   中英

針對 Cocos3D 的 Xcode12 編譯錯誤:不兼容的塊指針類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM