用 C 语言包装C++接口

Wrapping a C++ interface in C

本文关键字:C++ 接口 包装 语言      更新时间:2023-10-16

我有一个C++应用程序,它作为dll实现,并且它与C++应用程序一起成功运行。现在,我正在尝试将我的C++界面包装在C中,以便能够将我的应用程序也与C客户端一起使用。

我已经编写了我的C++接口(“Writer.hpp”)的方法之一,我想在C中调用它。C,我写了一个用于包装的C_Writer.hC_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 进行编译。这是我看到的最简单的方法。