用于导出以及C和C ++ API的单个头文件

时间:2018-09-03 06:14:32

标签: c++ c

我有一组C ++类,其对象在纯C ++文件中管理。对于这个文件,我有一个头文件。我想从C模块访问某些API,而另一些从C ++模块访问。有什么建议可以实现吗?

为尝试这种方法,我编写了以下文件。

我的主类及其实现(myclass.h和myclass.cpp):

myclass.h

#ifndef _MY_CLASS_H
#define _MY_CLASS_H

#include<iostream>
#include<string>

class MyClass
{
    public:
        MyClass();
        ~MyClass();

        void setServer(std::string url);
        void printServer();
    private:
        std::string serverURL;
};

#endif

myclass.cpp

#include "myclass.h"

MyClass::MyClass()
         :serverURL("")
{
}

MyClass::~MyClass()
{
}

void MyClass::setServer(std::string url)
{
    serverURL = url;
}

void MyClass::printServer()
{
    if (serverURL == "") {
        std::cout << "Server URL is empty\n";
    } else {
        std::cout << "Server URL : " << serverURL << std::endl;
    }
}

现在,编写了一个使用以上类的包装器。目的是向C模块公开两个API init()和uninit(),为C ++模块提供两个API。

wrappe.h

#ifndef _WRAPPER_H
#define _WRAPPER_H

#include<string>

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// APIs that are exposed to C module(s)
void init();
void uninit();

#ifdef __cplusplus
}
#endif // __cplusplus

// C++ APIs exposed to C++ modules
#ifdef __cplusplus
void setServer(std::string url);
void printS();
#endif // __cplusplus

#endif // _WRAPPER_H

wrapper.cpp

#include "myclass.h"

static MyClass *myClass = 0;

void init()
{
    myClass = new MyClass();
}

void uninit()
{
    if (myClass != 0) {
        delete myClass;
    }
}

void setServer(std::string url)
{
    myClass->setServer(url);
}

void printS()
{
    if (myClass != 0) {
        myClass->printServer();
    }
}

这是访问C API的C模块文件。

后端。h

#ifndef _BACKEND_H
#define _BACKEND_H

#ifndef __cplusplus
extern "C" {
#endif

void backend_init();
void backend_uninit();

#ifndef __cplusplus
}
#endif

#endif

后端。c

#include "wrapper.h"
#include "backend.h"

void backend_init()
{
    init();
}

void backend_uninit()
{
    uninit();
}

这是C ++模块文件,它们调用wrapper.h的API。

guiuser.h

ifndef _GUIUSER_H
#define _GUIUSER_H

void gui1();
void gui2();

#endif

guiuser.cpp

#include "wrapper.h"

void gui1()
{
    setServer("localhost");
}

void gui2()
{
    printS();
}

这是调用模块API的主文件。

main.cpp

#include "guiuser.h"
#include "backend.h"
#include "wrapper.h"

int main()
{
    backend_init();
    gui1();
    gui2();
    backend_uninit();
}

backend.c的编译失败 wrapper.h:4:17:致命错误:字符串:没有这样的文件或目录 编译终止。

我应该将wrapper.h分成两部分吗?一个包含在后端,另一个包含在guiuser中?

关于设计还有其他建议吗?

1 个答案:

答案 0 :(得分:1)

<string>是仅C ++头。用与#include <string>相同的预处理逻辑将setServer括起来。

#ifdef __cplusplus
#include <string>
#endif