如何在启用 ARC 的情况下将 Objective-C 代码转换为 C++

Jef*_*.Lu 2 c++ objective-c clang automatic-ref-counting

一篇与Objective-C的Block相关的博客说:当ARC启用时,代码如下:

typedef int (^blk_t)(int);
blk_t func(int rate)
{
    return ^(int count){return rate * count;};
}
Run Code Online (Sandbox Code Playgroud)

可以用clang的-rewrite-objc翻译成C++代码如下:

blk_t func(int rate)
{
    blk_t tmp = &__func_block_impl_0(__func_block_func_0, &__func_block_desc_0_DATA, rate);
    tmp = objc_retainBlock(tmp);
    return objc_autoreleaseReturnValue(tmp); 
}
Run Code Online (Sandbox Code Playgroud)

我尝试用以下方法进行翻译,但没有成功。

  1. clang -rewrite-objc test.m --> 该命令可以将test.m翻译成cpp代码。但我看不到 objc_retainBlock 和 objc_autoreleaseReturnValue 的调用。
  2. clang -rewrite-objc -fobjc-arc test.m -> 此命令将失败并显示“错误:当前部署目标不支持自动 __weak 引用”。结果,cpp代码没有生成。
  3. clang -rewrite-objc -fobjc-arc -mmacosx-version-min=10.11 test.m,行为与#2相同。

问题:如何使用 clang 的 -rewrite-objc 选项将启用 ARC 的 Objective-C 代码转换为 cpp?

Jef*_*.Lu 5

最后,我找到了缺少的 clang 选项:-fobjc-runtime; 重写在指定 objc-runtime 版本后起作用。例如以下命令:

clang -x objective-c -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.1.sdk -rewrite-objc -fobjc-arc -fblocks -mmacosx-version-min=10.11  -fobjc-runtime=macosx-10.11 -O0  test.m
Run Code Online (Sandbox Code Playgroud)