From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,d7a4bf5a82094fb X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2002-10-10 14:47:43 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!nntp.cs.ubc.ca!news-feed.riddles.org.uk!sn-xit-03!sn-xit-06!sn-post-01!supernews.com!corp.supernews.com!not-for-mail From: "Matthew Heaney" Newsgroups: comp.lang.ada Subject: Re: Rational Apex Ada - Pragma interface with C++ Date: Thu, 10 Oct 2002 17:47:41 -0400 Organization: Posted via Supernews, http://www.supernews.com Message-ID: References: X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-Complaints-To: abuse@supernews.com Xref: archiver1.google.com comp.lang.ada:29696 Date: 2002-10-10T17:47:41-04:00 List-Id: "John Smith" wrote in message news:H3s05H.LMt@news.boeing.com... > Does anyone know how to use pragma interface for interfacing C++ functions > to an Ada program. I know how to do it with C, but can't seem to get it to > work with C++. Interfacing with C++ requires care, especially if you have static variables the require elaboration-time initialization. When a C++ program loads, all the statics get initialized. There will be some code inserted by the compiler to go this, just prior to call the C++ main. The same is true of an Ada program. In general, a C++ program will need a C++ main, and an Ada program will need an Ada main. If you don't have any statics, you may OK. There's no official function you can call from an Ada program to perform the C++ initialization -- you'll have to check your compiler docs. There are official functions to perform Ada initialization -- there are two linker symbols called "adainit" and "adafinal". If you have a C++ main, and you're calling code written in Ada, then you'll need to call these. In any event, there's no pragma to interface with C++ directly. I know GNAT has compiler-specific pragmas to do this. However, I wouldn't bother. Just create a C wrapper, and link to those. For example, if you have a C++ class you want to use from Ada, like this: class C { public: void f(); //... }; Assuming you don't mind manipulating a pointer, you can do this: extern "C" C* makeC() { return new C; } extern "C" void freeC(C* p) { delete p; } extern "C" void c_f(C* p) { p->f(); } On the Ada side, create a set of bindings for each of the external functions above, e.g. function Make_C return System.Address; pragma Interface (C, Make_C); procedure Free_C (Object : System.Address); pragma Interface (C, Free_C); procedure C_F (Object : System.Address); pragma Interface (C, C_F); You could add more type safety than I've shown above, e.g. package C_Types is type C_Type (<>) is limited private; type C_Access is access all C_Type; pragma Convention (C, C_Access); function New_C return C_Access; procedure Free (C : in out C_Access); procedure Do_F (C : access C_Type); private type C_Type is null record; function Make_C return C_Access; pragma Interface (C, Make_C); --etc end C_Types;