【问题标题】:Missing bridge cast causes error in preprocessed source but not in real source缺少桥接会导致预处理源出错,但不会在真实源中出错
【发布时间】: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


【解决方案1】:

比较ARC - implicit bridging: “CFString.h”和其他核心基础头文件包含宏

CF_IMPLICIT_BRIDGING_ENABLED
...
CF_IMPLICIT_BRIDGING_DISABLED

扩展为

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

这使得 Clang 不会抱怨缺少 __bridge 演员表。

编译指示被预处理器“消耗”,因此不在预处理器中 文件。 由于无论如何您都在转换预处理的源,您可以添加 这些 pragma 再次指向预处理文件的开始/结束。 那么编译的时候就不会出现警告了。

【讨论】:

  • 谢谢你,这对我帮助很大!我也测试了其他的pragma,都是预处理后留下的,为什么会消耗掉?您知道,是否可以禁用此行为?
  • @ElvissStrazdiņš:我不知道。
猜你喜欢
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多