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

文卡塔(Venkata Subbarao)

我有一组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。

包装

#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

包装器

#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模块文件。

后端

#ifndef _BACKEND_H
#define _BACKEND_H

#ifndef __cplusplus
extern "C" {
#endif

void backend_init();
void backend_uninit();

#ifndef __cplusplus
}
#endif

#endif

后端

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

void backend_init()
{
    init();
}

void backend_uninit()
{
    uninit();
}

这是调用wrapper.h API的C ++模块文件

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中?

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

萨胡

<string>是仅C ++头文件。#include <string>用与您使用的相同的预处理器逻辑包围该setServer

#ifdef __cplusplus
#include <string>
#endif

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在C ++中将多个头文件导出为单个头文件?

单个头文件中的命名空间和类及其方法定义如何在多个头文件或cpp文件中使用呢?

在C中链接多个头文件

如何在另一个头文件中包含c头文件?

C++ - 在另一个头文件中包含一个头文件以使全局变量可用于数组声明

为什么多个头文件和源文件中的 C++ 继承不起作用?

C++ 友元函数不起作用(有多个头文件和源文件)

使用两个 .cpp 文件和一个头文件

在C ++中使用另一个头文件中的抽象类

C ++:如何初始化使用两个头文件的对象?

C++ 在两个头文件中包含一个类

C++ 对类的未定义引用(1 个头文件 2 个 cpp)

为什么 C++ 标准将容器类拆分为多个头文件?

为什么我的文件在 C 中分叉时即使有守卫也执行两次这个头文件?

C头文件包含在另一个头文件中,并且都包含在ac文件中

如何在 C 编程中将两个头文件和 3 个 c 文件链接到一个可执行文件中?

在 C 或 C++ 中,如何防止头文件中先前的 #define 影响以后包含的另一个头文件?

C ++创建一个头文件来解决循环依赖是一个好主意吗?

我应该在每个头文件中放置一个 C++ 宏保护吗?

在 VS 2017 中为“便携式”项目包含一个头文件(C++)

C编程如何在另一个头文件中打印出结构的元素?

如何在 C 中包含另一个头文件中定义的结构数组?

编译单个大头文件(VS:C1063)

在两个项目之间同步单个C头文件

如果在使用 CMake 和 C++ 编译时两个头文件共享相同的名称会发生什么?

将头文件与C和C ++关联

C头文件如何导入win32api函数?

C头文件和源文件结构

C-头文件