gpt4 book ai didi

c++ - 在 C 中包装 C++ 接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:04 25 4
gpt4 key购买 nike

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

我已经编写了我想在 C 中调用的 C++ 接口(interface) (“Writer.hpp”) 的方法之一.在 C 中,我编写了一个 C_Writer.hC_Writer.c 用于包装。

C_Writer.h 包含指向 C++ 类型(结构)定义的指针和我想在 C 中调用的方法。

C_Writer.c 中,我包含了 Writer.hpp(C++ 接口(interface))和 C_Writer.h 并且我已经连接了C 指向带有 C++ 类型的 C++ 类型的指针,也声明了方法。

现在我要做的是在一个简单的 C 控制台应用程序 (CInterfaceTest) 中调用这个 C 方法来测试是否有用。

但是在 “dataTimeStamp -> timeStamp.date.Day = 10;” 行,它给出了错误 “1>.\CInterfaceTest.cpp(22) : error C2027: use未定义类型的“Timestamp_Alias””

你知道我错过了什么吗?

部分代码如下:

C++ 接口(interface)

Writer.hpp
virtual Status write(DataBlock sampleData, TimeStamp dataTimestamp) = 0;

C接口(interface)

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 接口(interface)的简单控制台应用程序。

//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++ header 包含在 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 进行编译。这是我看到的最简单的方法。

关于c++ - 在 C 中包装 C++ 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22936889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com