2009-03-04 45 views
3

你可以從Ada調用C++函數嗎?你可以從Ada調用C++函數嗎?

我想知道是否有一種方法可以直接執行此操作,而無需在C中執行實現並編寫C++包裝器&和Ada包裝器,例如,我想去C++ - > Ada而不是C++ - > c - > Ada。

+0

世界上有多個操作系統。有多個C++實現。有多個Ada實現。你所要求的不是一個語言定義的東西,而是一個實現的東西。你需要包含更多的細節。 – 2009-03-04 22:50:29

+0

我很困惑。這個問題開始說你想要去Ada-> C++,但最後說你想要去C++ - > Ada。這些是非常不同的東西。 – 2009-03-04 23:17:50

+0

我應該澄清這個符號......這裏的 - >意思是「由...導入」或「由...調用」。我所得到的是,我不想爲我的C++編寫C封裝來進入Ada,而是直接進入。 Sry說得不是很清楚。 – paxos1977 2009-03-05 22:42:46

回答

4

的問題,以C++是C++沒有一個定義ABI。
允許每個編譯器定義最有效的ABI。

因此,與其他語言(Ada)的接口是一種痛苦,因爲您需要您的Ada編譯器知道C++編譯的是哪個編譯器,然後才能生成調用任何C++方法/函數的正確代碼。

另一方面,C ABI在所有編譯器中都定義了一個標準,因此爲任何連接的語言提供了一個很好的方便界面。

1

這似乎並不可能......

here

信息 「的直接接口C++從阿達是艾達(至少95)的範圍之外」

+0

這只是意味着沒有*標準*的方式來做到這一點,並不是說這是不可能的。 – 2010-03-03 16:34:58

0

Green Hills軟件公司也出版了一本很棒的PDF。
http://www.ghs.com/download/whitepapers/ada_c++.pdf

+0

錯誤...沒有。 Green Hills不使用GCC。他們有自己的編譯器,我相信它使用Itermetrics(現在是SofCheck?)前端。 但是,該PDF中的大部分信息實際上是與編譯器無關的。 Ada在標準中規定了這種東西的驚人數量。 – 2009-03-06 14:34:05

1

99/00以來我都沒有碰過這樣的Ada我的記憶可能有點模糊,但,當我們在圖形窗口的應用程序在阿達工作,我們需要做一些東西在C++(非關鍵任務)我們將兩者結合起來的方式是在dll中使用C++的東西,然後爲該dll創建一個C封裝器,然後使用指定c封裝器的編譯指示接口,然後我們可以調用dll中的方法該界面。

我認爲它達到了一些三重維護,因爲方法簽名必須更新在編譯指示接口和C包裝,如果他們在c + + dll中更改。

基本上這是一個痛苦。我認爲我們必須在C封裝器中使用Win32 Lean和Mean預編譯器指令。

無論如何,那就是我們三個在項目中工作的人都能記住的。

4

我可以給你的唯一真正的編譯器不可知的答案是它只是從你的系統上從C調用C++。

就像使用C一樣,你必須弄清楚你的C++例程的名稱 - 損壞的符號,並在鏈接到該錯位名稱的C(在本例中爲Ada)一側上編寫一個綁定。你也可能需要在C++端做一些事情,比如聲明C++函數extern。

如果你可以聲明你的C++函數extern「C」,那很簡單。只需在C++端執行此操作,並在Ada端使用Ada的標準C導入功能。

例:

在你的CPP

extern "C" int cpp_func (int p1, int p2) { 
    ; // Whatever.. 
} 
在您的名.adb

function cpp_func (p1, p2 : Interfaces.C.Int) return Interfaces.C.Int; 
pragma Import (C, cpp_func); 

... 
Result : constant Interfaces.C.Int := cpp_func (1, 2); 
相關問題