Elegantly call C++ from C

前端 未结 4 1884
不知归路
不知归路 2020-11-28 23:04

We develop some project in plain C (C99). But, we have one library as source codes (math library) in C++. We need this library so I would like to a

4条回答
  •  臣服心动
    2020-11-28 23:45

    The only reason to want to inherit from the duck struct would be to expose some to its attributes in the C API, which is generally considered bad style anyway. Without inheritance, your C header would look like this:

    struct Duck;
    
    struct Duck* new_Duck(int feet);
    void delete_Duck(struct Duck* d);
    void Duck_quack(struct Duck* d, float volume);
    

    And this would be the corresponding implementation, with no need for type casts:

    extern "C" {
    #include "Duck.h"
    }
    
    class Duck {
    public:
        Duck(int feet) : {}
        ~Duck() {}
    
        void quack(float volume) {}
    };
    
    struct Duck* new_Duck(int feet) { return new Duck(feet); }
    void delete_Duck(struct Duck* d) { delete d; }
    void Duck_quack(struct Duck* d, float volume) { d->quack(volume); }
    

    In the same way, a C API can be created for a C++ interface (pure virtual class) and its implementations. In that case, only the constructor need to be based on the concrete implementation (e.g. new_RubberDuck(2)). The destructor and all other functions will automatically operate on the correct implementation, same as in C++.

提交回复
热议问题