2014-01-15 65 views
3

要編譯源文件,clang會先對其進行預處理,然後對其進行編譯。所以如果我運行clang -E,我應該得到一個預處理文件,可以用clang -c進行編譯。但是下面的代碼在預處理之後不能編譯。丟失的橋樑會導致預處理源中的錯誤,但不會導致實際源中的錯誤

int main(int argc, char * argv[]) 
{ 
    NSString* foo = @"bar"; 

    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
     NULL, 
     (CFStringRef)foo, 
     NULL, 
     (CFStringRef)@"", 
     kCFStringEncodingUTF8); 

    CFRelease(urlString); 

    return 0; 
} 

它編譯與鐺-c忽略FOO被轉換爲CFStringRef沒有__bridge。當代碼被預處理時,它不再編譯,並且clang抱怨缺少__bridge強制轉換。是否有禁用此行爲的標誌或解決此問題的方法?

全鐺命令(用它用於編譯和與-E預處理)

鐺-x目標c -arch armv7s -fmessage長度= 0 -fdiagnostics出現-音符包括堆疊-fmacro-backtrace-limit = 0 -std = gnu99 -fobjc-arc -Wno-trigraphs -fascal-strings -Os -Wno-missing-field-initializers -Wno-missing-prototypes -Werror = return-type -Wno-implicit -atomic-properties -Werror = deprecated-objc-isa-usage -Werror = objc-root-class -Wno-receiver-is-weak -Wno-arc-repeated-of-weak -Wduplicate-method-match -Wno -missing-braces -Wparentheses -Wwitwit -Wunused-function -Wno-unused-label -Wno -unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wno-unknown-prag mas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wshorten-64-to-32 -Winterinter-sign -Wno-newline- eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementation -DNS_BLOCK_ASSERTIONS = 1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/ iPhoneOS7.0.sdk -fstrict混疊-Wprotocol -Wdeprecated-聲明-g -fvisibility =隱藏-Wno-符號轉換-miphoneos版本分鐘= 7.0 -c的main.m

+1

如何將__bridge添加到演員陣列? – ipmcc

+1

向我們展示您傳遞給叮噹的其他旗幟。我的猜測是,在一種情況下,你已經啓用了ARC,而在另一種情況下,你沒有。 – alastair

+0

添加__bridge不是我的選擇,因爲我正在對預處理源進行一些轉換 –

回答

4

比較ARC - implicit bridging: 「CFString.h」和其他Core Foundation標題包含宏

CF_IMPLICIT_BRIDGING_ENABLED 
... 
CF_IMPLICIT_BRIDGING_DISABLED 

其擴展到

_Pragma("clang arc_cf_code_audited begin") 
... 
_Pragma("clang arc_cf_code_audited end") 

,並導致鏘不抱怨缺少__bridge轉換。

編譯指示被預處理器「消耗」,因此不在預處理的 文件中。 由於您正在轉換預處理源,因此您可以將 這些編譯指示再次添加到預處理文件的開始/結束位置。 然後在編譯時不會有任何警告。

+0

謝謝,這幫了我很多!我還測試了其他編譯​​指示,它們在預處理後都會被遺留下來,爲什麼這會被消耗掉?你知道嗎,是否可以禁用這種行爲? –

+0

@ElvissStrazdiņš:我不知道。 –