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

How to translate Objective-C code to C++ with ARC enabling

本文关键字:代码 Objective-C 转换 C++ 情况下 启用 ARC      更新时间:2023-10-16

一个与Objective-C块相关的博客说:当启用ARC时,以下代码:

typedef int (^blk_t)(int);
blk_t func(int rate)
{
    return ^(int count){return rate * count;};
}

可以通过clang:的-rewrite-obj翻译成如下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); 
}

我试着用下列方法翻译,但没有成功。

  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版本min=10.11 test.m,行为与#2相同

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

最后,我找到了缺少的clang选项:-fobjc runtime;在指定objc运行时版本后,重写工作就开始了。例如以下命令:

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