我有一个C++应用程序,它实现为一个dll,它正在成功地使用C++应用程序运行。现在,我正在尝试用C封装我的C接口,以便能够在C客户端上使用我的应用程序。
我编写了我的C++接口(“Writer.hpp”)的方法之一,我想在C中调用这些方法。在C中,我编写了一个用于包装的C_Writer.h和C_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++接口
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机器中使用VisualStudio2008ide。
发布于 2014-04-08 12:53:21
您没有在C_Writer.h文件中定义您的结构。如果未声明结构成员,则无法访问它们。此外,您还将C++头包含到C源文件中。您应该使用dll来编译包装器,而不是使用C项目。
实际上,如果您想包装C的C++类,就无法直接访问它的成员。例如,在这种情况下,您可以使用声明为extern函数的setters/getters来访问它们:
// 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进行编译。这是我看到的最简单的方法。
https://stackoverflow.com/questions/22936889
复制相似问题