Можете ли вы вызывать функции C ++ из Ada? - PullRequest
3 голосов
/ 04 марта 2009

Можете ли вы вызывать функции C ++ из Ada?

Мне интересно, есть ли способ сделать это напрямую, не выполняя реализацию на C и не написав обертку C ++ и обертку Ada, например Я хотел бы перейти c ++ -> Ada, а не c ++ -> c -> Ada.

Ответы [ 7 ]

4 голосов
/ 05 марта 2009

Единственный действительно независимый от компилятора ответ, который я могу вам дать, заключается в том, что это так же возможно, как вызов C ++ из C в вашей системе.

Как и в случае с C, вы должны выяснить искаженный символ вашей подпрограммы C ++ и написать привязку на стороне C (в данном случае Ada), которая ссылается на это искаженное имя. Вам также, вероятно, придется делать некоторые вещи на стороне C ++, например, объявлять функцию C ++ extern.

Если вы можете объявить вашу функцию C ++ вне "C", это легко. Просто сделайте это на стороне C ++ и используйте стандартные функции импорта Ada C на стороне Ada.

Пример:

в вашем 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);
4 голосов
/ 04 марта 2009

Проблема с Ada для C ++ состоит в том, что C ++ НЕ имеет определенного ABI.
Каждому компилятору разрешается определять наиболее эффективный ABI, какой только может.

Таким образом, сопряжение с другими языками (Ada) является проблемой, так как вам нужно, чтобы ваш компилятор Ada знал, с каким компилятором был скомпилирован C ++, прежде чем он сможет сгенерировать правильный код для вызова любого метода / функции C ++.

С другой стороны, C ABI четко определен как стандарт для всех компиляторов и, таким образом, обеспечивает удобный и удобный интерфейс для любого языка, к которому можно подключиться.

2 голосов
/ 14 октября 2009

Вас может заинтересовать этот документ, в котором обсуждается привязка Ada к C ++ на уровне объектов:

http://www.adacore.com/uploads/technical-papers/Class_level_interfacing.pdf

Кроме того, в последней версии GNAT имеется мощный автоматический генератор привязок.

1 голос
/ 04 марта 2009

Swig может сделать это

1 голос
/ 04 марта 2009

Я не трогал Аду с 99/00, поэтому моя память может быть немного неаккуратной, но когда мы работали над приложением с графическими окнами в Аде, нам нужно было кое-что сделать на C ++ (не критически важного) и то, как мы они включали в себя создание компонента c ++ в dll (s), а затем создавали обертку C для этой DLL, а затем использовали прагматический интерфейс, который определял обертку c, а затем мы могли вызывать методы внутри dll из этого интерфейса.

Я думаю, что это потребовало некоторой тройной поддержки, потому что сигнатуры методов должны были быть обновлены в интерфейсе pragma и оболочке C, если они изменились в dll c ++.

В основном это была боль. Я думаю, что мы должны были использовать директиву Win32 Lean и Mean precomplier в оболочке C.

Во всяком случае, это все, что мы трое, работавшие над проектом, могут вспомнить.

1 голос
/ 04 марта 2009

Это не представляется возможным ...

Информация от здесь

«Прямой интерфейс к C ++ от Ada выходит за рамки Ada (не менее 95)»

0 голосов
/ 04 марта 2009

Green Hills Software также опубликовала отличный PDF-файл об этом.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

...