2011-05-03 76 views
4

我有一個簡單的問題。 我有兩個庫,一個用C編譯,另一個用C++編譯,其中C庫由C++庫鏈接和加載。我需要在C庫中聲明一個結構實例,它們都可以讀取和寫入。 你如何做到這一點?在C和C++庫之間共享一個變量的困境

感謝

編輯:補充說,它是一個結構,而不僅僅是聲明

+0

庫不是通信機制。 – 2011-05-03 09:11:51

+0

@unapersson他並沒有使用圖書館作爲「溝通機制」。他希望圖書館之間共享數據。注意到這個錯誤。 – 2011-05-03 09:31:58

回答

8

需要創建其通過在C和C++庫兩個模塊包括在單個的頭文件:

#ifndef YOURSTRUCT_H 
#define YOURSTRUCT_H 

#ifdef __cplusplus 
extern "C" { 
#endif 
    struct YourStruct 
    { 
     // your contents here 
    }; 
#ifdef __cplusplus 
} 
#endif 
// UPDATE: declare an instance here: 
extern YourStruct yourInstance; 
#endif 

頭文件的這種形式意味着兩個編譯器將樂於讀標題文件和兩個將產生相同的名稱mangling。

更新:
然後你需要一個模塊文件。只有一個。無論是C文件,如果它是被包含在你的C庫或C++文件,如果它是被包含在你的C++庫:

#include "yourstruct.h" 

YourStruct yourInstance; 

現在全球實例的任何客戶端,無論是C客戶端或C++客戶端只是必須#include "yourstruct.h"和參考yourInstance

更新:
作爲馬修指出,你最好通過指針實例周圍。例如。

#include "yourstruct.h" 

#ifdef __cplusplus 
extern "C" { 
#endif 

void yourFunction(YourStruct* someInstance); 

#ifdef __cplusplus 
} 
#endif 
+2

強制注意:全局變量是** evil **,請考慮將參數傳遞給函數。 – 2011-05-03 09:35:26

+0

@Matthieu:非常好。我會將其添加到我的答案中。 – quamrana 2011-05-03 09:38:12

2

使用外部C鏈接規範的一個實例。

#ifdef __cplusplus 
extern "C" { 
#endif 

    struct YourStruct 
    { 


    }; 
#ifdef __cplusplus 
} 
#endif 
+0

這不就是出口的結構聲明?我想分享一個結構實例,對不起,如果它不清楚 – KaiserJohaan 2011-05-03 09:09:44

+0

@KaiserJohaan:是的,但外部「C」塊與實例和函數的聲明一樣工作。 – 2011-05-03 09:14:51

+1

這不是合法的C代碼。 – 2011-05-03 09:33:07

1
extern struct YourStruct *yourstruct_instance; 

在頭一個應該做的工作。

+0

@quamrana擊敗了我:) – 2011-05-03 09:21:31

0

從你的c庫導出結構的一個實例。讓C++庫包含c庫中的頭文件。

在C庫.h文件:

#ifdef __cplusplus 
extern "C" { 
#endif 
__declspec(dllexport) struct MyStruct 
{ 
    // members 
} 
extern __declspec(dllexport) struct MyStruct myInstance; 
#ifdef __cplusplus 
} 
#endif 

在C庫.c文件:

__declspec(dllexport) struct MyStruct myInstance; 

C和C++代碼然後可以操縱myInstance

請參閱this article獲取更多信息。另外,嘗試創建一個新的C++ dll項目並檢查'導出符號'框。這將創建一個帶有導出的類和該類的實例的C++ dll。在c中爲導出的結構做同樣的事情非常相似。