Pergunta

Eu sou um novato completo Ada, embora eu usei Pascal por 2-3 anos durante HS.

IIRC, é possível chamar funções compiladas Pascal de C / C ++. É possível chamar procedimentos e funções escritas em Ada de C ++?

Foi útil?

Solução

De acordo com esta velho tutorial , deve ser possível.

No entanto, como ilustrado por esta discussão , você deve ter cuidado com as c ++ extern "C definições de suas funções ada".

Outras dicas

Aqui está um exemplo usando g ++ / gnatmake 5.3.0:

NOTA: Tenha cuidado ao passar dados entre C ++ e 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;
    }

Referências:

Esse tipo de coisa é feito o tempo todo. O truque é contar ambos os lados para usar um protocolo chamado de estilo "C" para a rotina. Em C ++ isso é feito com extern declarações "C", e no lado de Ada com pragma Exportação ( "C", ...

Olhe aqueles em suas respectivas fontes de referência favorito para mais detalhes. Cuidado com ponteiro e referência paramters!

Absolutamente é possível. Nos últimos cinco anos, tenho vindo a trabalhar em um sistema que mistura C ++ e Ada.

Sim. Vários anos atrás eu escrevi um curto simples demonstração para provar isso. Havia dois DLLs, uma escrita em C ++ e o outro em Ada. Eles só adicionado constantes para valores de ponto flutuante. Duas aplicações, uma em C ++ e um em Ada, cada um, utilizados tanto a DLL. Assim, todas as combinações possíveis de C ++ chamando / chamada de Ada existiu. Tudo funcionou bem. Este foi no Windows qualquer versão era atual no momento; Não me lembro, mas pode ter começado este trabalho no Linux ou BeOS.

Agora, se eu pudesse encontrar o código-fonte do que ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top