From: Ron Wills <ron.rwsoft@gmail.com>
Subject: Re: Linking Ada to C++ Overloaded Functions and Methods
Date: Sat, 7 Apr 2018 13:07:36 -0700 (PDT)
Date: 2018-04-07T13:07:36-07:00 [thread overview]
Message-ID: <959c633f-237d-47ea-88ff-4ad29faeb6c7@googlegroups.com> (raw)
In-Reply-To: <fisj3hF8nk6U1@mid.individual.net>
On Saturday, April 7, 2018 at 1:05:24 PM UTC-6, Niklas Holsti wrote:
> On 18-04-07 21:35 , Ron Wills wrote:
> > I know that both Ada and C++ can overload functions and methods. The problem I'm having is when I'm trying to link Ada to overload C++ functions. I know I could use different Ada names, but if it's possible to keep the same names in Ada it would save a lot of re-coding.
> >
> > An example is from the FLTK library. The "draw_box" method from the Fl_Widget class is overloaded and I get the following from g++ -fdump-ada-spec.
> >
> > procedure draw_box (this : access constant Fl_Widget'Class);
> > pragma Import (CPP, draw_box, "_ZNK9Fl_Widget8draw_boxEv");
> >
> > procedure draw_box
> > (this : access constant Fl_Widget'Class;
> > t : Fl_Enumerations_H.Fl_Boxtype;
> > c : Fl_Enumerations_H.Fl_Color); -- /usr/include/Fl/Fl_Widget.H:181
> > pragma Import (CPP, draw_box, "_ZNK9Fl_Widget8draw_boxE10Fl_Boxtypej");
> >
> > The C++ name mangling works to uniquely identify the C++ methods, but the compiler is choking on the Ada names as already being declared.
> >
> > fl_fl_widget_h.ads:171:07: entity "draw_box" was previously imported
> > fl_fl_widget_h.ads:171:07: (pragma "Import" applies to all previous entities)
> > fl_fl_widget_h.ads:171:07: import not allowed for "draw_box" declared at line 164
> > fl_fl_widget_h.ads:181:07: entity "draw_box" was previously imported
> > fl_fl_widget_h.ads:181:07: (pragma "Import" applies to all previous entities)
> > fl_fl_widget_h.ads:181:07: import not allowed for "draw_box" declared at line 167
> >
> > Is there a way to use overloaded Ada names with C++ or do I need to find a unique Ada name for every C++ overload method?
> >
>
> I would try to change the pragma Imports into aspects, something like this:
>
> procedure draw_box (....)
> with Import,
> Convention => CPP,
> Link_Name => "_ZNK9Fl_Widget8draw_boxE10Fl_Boxtypej";
That worked perfectly! Thanks!
> Aspects are syntactically tied to the subprogram declaration in which
> they occur, so overloaded subprograms with the same identifier can be
> given different aspect values, unlike for pragma Import.
>
> Note that I'm not fully sure if you should use the Link_Name aspect or
> the External_Name aspect. The C++ identifiers given in the pragma
> Imports are External_Name values, but I think they are also Link_Name
> values.
>
> --
> Niklas Holsti
> Tidorum Ltd
> niklas holsti tidorum fi
> . @ .
next prev parent reply other threads:[~2018-04-07 20:07 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-07 18:35 Linking Ada to C++ Overloaded Functions and Methods Ron Wills
2018-04-07 19:01 ` Dan'l Miller
2018-04-07 19:05 ` Niklas Holsti
2018-04-07 20:07 ` Ron Wills [this message]
2018-04-07 20:25 ` Jere
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox