我有一组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中?
关于设计还有其他建议吗?
答案 0 :(得分:1)
<string>
是仅C ++头。用与#include <string>
相同的预处理逻辑将setServer
括起来。
#ifdef __cplusplus
#include <string>
#endif