簡體   English   中英

用 C 包裝 C++ 接口

[英]Wrapping a C++ interface in C

我有一個C++應用程序,它作為一個dll實現,它成功地與C++應用程序一起運行。 現在,我試圖總結我的C++接口C能夠使用我的應用程序C客戶也是如此。

我已經編寫了我想在C調用的C++接口( “Writer.hpp” )的方法之一。 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;
}

注意:我在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM