缺少桥接强制转换会导致预处理源中出现错误,但实际源中不会出现错误



要编译源文件,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;
}

它使用clang-c编译,忽略了foo在没有__bridge的情况下被强制转换为CFStringRef。当代码被预处理时,它不再编译,clang抱怨缺少__bridge转换。是否有禁用此行为的标志或解决此问题的方法?

完整的clang命令(用于编译和预处理-E)

clang-x objective-c-arch armv7s-fmessage length=0-fdiagnostics show note include stack-fmacro backtrace limit=0-std=gnu99-fobjc arc-Wno trigraphs-fpascal strings-Os-Wno缺少字段初始值设定项-Wno缺少原型-Wror=返回类型-Wno隐式原子属性-Werror=不推荐使用objc isa用法-Wror=objc根类-Wno接收器弱-Wno arc重复使用弱-Wduplicate方法匹配-Wno缺少大括号-W括号-Wswitch-Wunused函数-Wno未使用的标签-Wno已使用的参数-Wunued变量-Wunuzed值-Wempty正文-Wuninitialized-Wno未知杂注-Wno阴影-Wno四个字符常量-Wno转换-Wconstant转换-Wint转换-Wbool转换-Wenum转换-Wshorten-64-to-32-Wpointer符号-Wno换行符-Wno选择器-Wno严格选择器匹配-Wundeclared选择器-没有不推荐使用的实现-DNS_BLOCK_ASSERTIONS=1-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DDeveloper/SDKs/iPhoneOS7.0.sdk-fsstrict aliasing-Wprotocol-W弃用的声明-g-fvisibility=hidden-W无符号转换-miphoneos版本min=7.0-c main.m

比较ARC-隐式桥接:"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")

并且这使得Clang没有抱怨丢失CCD_ 1投射。

杂注由预处理器"消耗",因此不在预处理器中文件由于您无论如何都在转换经过预处理的源,因此可以添加这些杂注再次指向预处理文件的开始/结束。那么编译它时不会有任何警告。

最新更新