【发布时间】:2014-01-15 16:22:51
【问题描述】:
为了编译一个源文件,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-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-use-of -weak -Wduplicate-method-match -Wno-missing-braces -W括号 -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wno -unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno -newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementations -DNS_BLOCK_ASSERTIONS=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer /SDKs/iPhoneOS7.0.sdk -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -g -fvisibility=hidden -Wno-sign-conversion -miphoneos-version-min=7.0 -c main.m
【问题讨论】:
-
将
__bridge添加到演员阵容中怎么样? -
向我们展示您传递给 clang 的其余标志。我的猜测是,在一种情况下你启用了 ARC,而在另一种情况下你没有。
-
添加 __bridge 对我来说不是一个选项,因为我正在对预处理的源进行一些转换
-
@ElvissStrazdiņš:
clang -E main.m > main.i ; clang -x objective-c -c main.i在我的 Xcode 5.2 中没有给出任何警告。 -
@MartinR:您应该启用 ARC 以查看错误,添加
-fobjc-arc参数。
标签: objective-c automatic-ref-counting