[英]Wrapping a C++ interface in C
我有一个C++
应用程序,它作为一个dll
实现,它成功地与C++
应用程序一起运行。 现在,我试图总结我的C++
接口C
能够使用我的应用程序C
客户也是如此。
我已经编写了我想在C
调用的C++
接口( “Writer.hpp”
)的方法之一。 在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;
}
注意:我在 Win7 x64 机器上使用 Visual Studio 2008 ide。
您没有在C_Writer.h
文件中定义您的结构。 如果未声明结构成员,则无法访问它们。 您还将 C++ 头文件包含在 C 源文件中。 您应该使用 dll 编译包装器,而不是使用 C 项目。
实际上,如果您想为 C 包装 C++ 类,则无法直接访问其成员。 例如,在这种情况下,您可以使用声明为外部函数的 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 进行编译。 这是我看到的最简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.