首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C封装C++接口

用C封装C++接口
EN

Stack Overflow用户
提问于 2014-04-08 12:23:03
回答 1查看 167关注 0票数 2

我有一个C++应用程序,它实现为一个dll,它正在成功地使用C++应用程序运行。现在,我正在尝试用C封装我的C接口,以便能够在C客户端上使用我的应用程序。

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

C_Writer.h包括指向C++类型(structs)定义的指针以及我想在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++接口

代码语言:javascript
复制
Writer.hpp
virtual Status write(DataBlock sampleData, TimeStamp dataTimestamp) = 0;

C接口

代码语言:javascript
复制
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__

实施文件:

代码语言:javascript
复制
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接口。

代码语言:javascript
复制
//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机器中使用VisualStudio2008ide。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-08 12:53:21

您没有在C_Writer.h文件中定义您的结构。如果未声明结构成员,则无法访问它们。此外,您还将C++头包含到C源文件中。您应该使用dll来编译包装器,而不是使用C项目。

实际上,如果您想包装C的C++类,就无法直接访问它的成员。例如,在这种情况下,您可以使用声明为extern函数的setters/getters来访问它们:

代码语言:javascript
复制
// 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进行编译。这是我看到的最简单的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22936889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档