用 C 语言包装C++接口
Wrapping a C++ interface in C
我有一个C++
应用程序,它作为dll
实现,并且它与C++
应用程序一起成功运行。现在,我正在尝试将我的C++
界面包装在C
中,以便能够将我的应用程序也与C
客户端一起使用。
我已经编写了我的C++
接口(“Writer.hpp”
)的方法之一,我想在C
中调用它。C
,我写了一个用于包装的C_Writer.h
和C_Writer.c
。
C_Writer.h
包括指向C++
类型(结构)定义的指针以及我想在C
中调用的方法。
在C_Writer.c
中,我包含了Writer.hpp
(C++接口)和C_Writer.h
,并将C
指针连接到具有C++
类型的C++
类型,还声明了该方法。
现在我要做的是在一个简单的C
控制台应用程序(CInterfaceTest
)中调用这个C
方法来测试它是否有效。
但是在第“dataTimeStamp -> timeStamp.date.Day = 10;”
行,它给出了错误“1>.CInterfaceTest.cpp(22) : error C2027: use of undefined type ' Timestamp_Alias'”
.
你知道我错过了什么吗?
这是代码的一部分:
C++界面
Writer.hpp
virtual Status write(DataBlock sampleData, TimeStamp dataTimestamp) = 0;
C 接口
C_Writer.h
#ifndef __C_WRITER_H__
#define __C_WRITER_H__
#ifdef __cplusplus
extern "C"
{
#endif
/*----------------------------------------------------*/
#if defined (WRITER_DLL_EXPORT)
#define WRITER_DLL __declspec(dllexport)
#elif defined (WRITER_DLL_IMPORT)
#define WRITER_DLL __declspec(dllimport)
#else
#define WRITER_DLL
#endif
//TYPEDEFS:
struct Status_Alias;
typedef struct Status_Alias* ptrToStatusType;
struct Timestamp_Alias;
typedef struct Timestamp_Alias* ptrToTimestampType;
struct DataBlock_Alias;
typedef struct DataBlock_Alias* ptrToDataBlockType;
//C-FUNCTIONS
I_WRITER_DLL extern
ptrToStatusType write_c (ptrToDataBlockType sampleData, ptrToTimestampType dataTimestamp);
#ifdef __cplusplus
}
#endif
#endif //__C_WRITER_H__
实施文件:
C_Writer.c
#include "Writer.hpp"
#include "C_Writer.h"
struct Status_Alias
{
Status status;
};
struct Timestamp_Alias
{
Time_Stamp timeStamp;
};
struct DataBlock_Alias
{
DataBlock sampleBlock;
};
ptrToStatusType write_c (ptrToDataBlockType sampleData, ptrToTimestampType dataTimestamp)
{
Status_Alias* alias = new Status_Alias ();
alias->status = GetWriterInterface()->write(sampleData->sampleBlock,dataTimestamp->timeStamp);
return alias;
}
用于测试 c 接口的简单控制台应用程序。
//testing C interface
// CInterfaceTest.cpp : main project file.
#include "C_Writer.h"
static void Main(string[] args)
{
ptrToStatusType statusCont;
ptrToDataBlockType datablock;
ptrToTimestampType dataTimeStamp; //10-10-2012 10:20:25
dataTimeStamp -> timeStamp.date.Day = 10;
dataTimeStamp -> timeStamp.date.Month = 10;
dataTimeStamp -> timeStamp.date.Year = 2012;
dataTimeStamp -> timeStamp.time.Hours = 10;
dataTimeStamp -> timeStamp.time.Minutes = 20;
dataTimeStamp -> timeStamp.time.Seconds = 25;
statusCont = write_c(datablock, dataTimeStamp);
return;
}
注意:我正在使用 Visual Studio 2008 IDE,在 Win7 x64 机器中。
您没有C_Writer.h
文件中定义结构。如果未声明结构成员,则无法访问这些成员。此外,您还将C++标头包含在 C 源文件中。您应该使用 dll 而不是 C 项目编译包装器。
实际上,如果要包装 C 的类C++,则无法直接访问其成员。例如,在这样的目的中,您可以使用声明为 extern 函数的 setter/getter 来访问它们:
// C_Writer.h
I_WRITER_DLL extern void setDateDay(ptrToTimestampType ptr, int value);
I_WRITER_DLL extern int getDateDay(prtToTimestampType ptr);
将它们实现到C_Writer.cpp
并使用 dll 进行编译。这是我看到的最简单的方法。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 带有进度表的 curl 多接口程序
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 类接口,可以创建N个方法
- 类具有相同的接口,但参数的类型不同
- 如何与 Cheerp/js 中的 extern 变量接口?
- 如何使用现代 CMake 安装捆绑的接口依赖项?