c++objective-cobjective-c++

Can I separate C++ main function and classes from Objective-C and/or C routines at compile and link?


I have a small C++ application which I imported Objective-C classes. It works as Objective-C++ files, .mm, but any C++ file that includes a header which may end up including some Objective-C header must be renamed to a .mm extension for the proper GCC drivers.

Is there a way to write either a purely C++ wrapper for Objective-C classes or can I separate the Objective-C objects out somehow and just link them separately? Maybe even if the Objective-C classes became a small library I could statically re-link at compile time?

The problem is that this code is cross-platform, and it is more difficult to compile on systems that normally do not use Objective-C (i.e. not Macs). Even though preprocessor commands restrict any implementation of Objective-C code on Windows or Linux, the original code still has .mm extensions and GCC still treats the code as Objective-C++.


Solution

  • Usually you simply wrap your Objective-C classes with C++ classes by e.g. using opaque pointers and forwarding calls to C++ methods to Objective-C methods.

    That way your portable C++ sources never have to see any Objective-C includes and ideally you only have to swap out the implementation files for the wrappers on different platforms.

    Example:

    // 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];
    }
    
    // ...