我可以在编译和链接中将C++主函数和类与Objective-C和/或C例程分开吗?

mik*_*e_b 6 c++ compiler-construction objective-c objective-c++

我有一个小的C++应用程序,我导入了Objective-C类.它可用作Objective-C++文件,.mm,但任何包含可能最终包含某些Objective-C标头的标头的C++文件必须重命名为.mm扩展名以获取正确的GCC驱动程序.

有没有办法为Objective-C类编写一个纯粹的C++包装器,或者我可以以某种方式将Objective-C对象分开并将它们分开链接?也许即使Objective-C类成为一个小型库,我可以在编译时静态重新链接?

问题是这个代码是跨平台的,并且在通常不使用Objective-C(即不是Mac)的系统上编译更加困难.即使预处理器命令限制在Windows或Linux上实现Objective-C代码,原始代码仍然具有.mm扩展名,GCC仍将代码视为Objective-C++.

Geo*_*che 3

通常,您只需使用 C++ 类包装 Objective-C 类,例如使用不透明指针并将对 C++ 方法的调用转发给 Objective-C 方法。

这样,您的可移植 C++ 源代码永远不必看到任何 Objective-C 包含内容,理想情况下您只需更换不同平台上包装器的实现文件。

例子:

// c++ header:
class Wrapper {
    struct Opaque;
    Opaque* opaque;
    // ...
public:
    void f();
};

// Objective-C++ source on Mac:
struct Wrapper::Opaque {
    id contained;
    // ...
};

void Wrapper::f() {
    [opaque->contained f];
}

// ...
Run Code Online (Sandbox Code Playgroud)