Можете ли вы вызывать функции Ada из C ++? - PullRequest
5 голосов
/ 01 ноября 2008

Я полный новичок Ады, хотя я использовал Паскаль в течение 2-3 лет во время HS.

IIRC, можно вызывать скомпилированные функции Pascal из C / C ++. Можно ли вызывать процедуры и функции, написанные на Аде, из C ++?

Ответы [ 5 ]

6 голосов
/ 01 ноября 2008

Согласно этому старому учебнику , это должно быть возможно.

Однако, как показано этой цепочкой , вы должны быть осторожны с определениями C ++ extern "C" ваших функций Ada.

4 голосов
/ 24 января 2017

Вот пример использования g ++ / gnatmake 5.3.0:

ПРИМЕЧАНИЕ. Будьте осторожны при передаче данных между C ++ и Ada

ada_pkg.ads

    package Ada_Pkg is
        procedure DoSomething (Number : in Integer);
        pragma Export (C, DoSomething, "doSomething");
    end Ada_Pkg;

ada_pkg.adb

    with Ada.Text_Io;
    package body Ada_Pkg is
        procedure DoSomething (Number : in Integer) is
        begin
            Ada.Text_Io.Put_Line ("Ada: RECEIVED " & Integer'Image(Number));
        end DoSomething;
    begin
        null;
    end Ada_Pkg;

main.cpp

    /*
    TO BUILD:
    gnatmake -c ada_pkg
    g++ -c main.cpp
    gnatbind -n ada_pkg
    gnatlink ada_pkg -o main --LINK=g++ -lstdc++ main.o
    */

    #include <iostream>

    extern "C" {
        void doSomething (int data);
        void adainit ();
        void adafinal ();
    }

    int main () {
        adainit(); // Required for Ada
        doSomething(44);
        adafinal(); // Required for Ada 
        std::cout << "in C++" << std::endl;
        return 0;
    }

Ссылки:

1 голос
/ 09 января 2009

Такого рода вещи делаются постоянно. Хитрость заключается в том, чтобы сказать обеим сторонам использовать в процедуре протокол вызова в стиле «С». В C ++ это делается с помощью внешних объявлений "C", а на стороне Ada - с помощью прагмы Export ("C", ...

Подробности смотрите в ваших любимых справочных источниках. Следите за указателями и ссылочными параметрами!

0 голосов
/ 07 января 2011

Да. Несколько лет назад я написал небольшую простую демонстрацию, чтобы доказать это. Было две библиотеки DLL, одна написана на C ++, а другая на Ada. Они просто добавили константы к значениям с плавающей точкой. Два приложения, одно на C ++ и одно на Ada, каждое использовало обе библиотеки DLL. Таким образом, существовала любая возможная комбинация вызова / вызова C ++ из Ada. Все работало нормально. Это было для Windows, какая бы версия не была текущей в то время; Я не помню, но, возможно, это работало на Linux или BeOS.

Теперь, если бы я только мог найти исходный код этого ...

0 голосов
/ 02 ноября 2008

Абсолютно это возможно. Последние пять лет я работаю над системой, которая смешивает C ++ и Ada.

...