<div dir="ltr">Hmmm, I haven't had to wrap anything using extern C because all the function prototypes are in C already I believe (the three I mentioned above). The main idea here is that I want to reuse my extensions in the same way that my classes are constructed. I want to write extensions separately for each class that I have already written in C++. I have already successfully written my extension for Foo. I can load Foo_ext.rkt in my racket script and execute all the functions that I need. The issue is that I have <i>another </i>class, Bar, that inherits from Foo. So as it stands now, I can't figure out how to write my Bar extension such that I don't have to rewrite (or copy and paste) all the code from my Foo extension. I'd like to leverage the fact that I already wrote the extension for Foo and Bar is just a few extra variables and functions. I hope this clearly illustrates my goal.<br>
<br>Thanks :-)<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Feb 6, 2014 at 12:17 PM, Jon Zeppieri <span dir="ltr"><<a href="mailto:zeppieri@gmail.com" target="_blank">zeppieri@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm not entirely sure that I follow, but if you're writing these<br>
extension functions in C++, I believe you'll need to wrap their<br>
prototypes in an extern(C) { ... } block so that they'll be given<br>
un-mangled names for the linker to use.<br>
<div><div class="h5"><br>
On Thu, Feb 6, 2014 at 4:56 PM, Cody Eilar <<a href="mailto:cody.eilar@gmail.com">cody.eilar@gmail.com</a>> wrote:<br>
> I understand that, the issue is that I have to provide three functions that<br>
> are not static so that I can make my c++ code known to scheme. Those<br>
> functions are:<br>
><br>
> scheme_reload(Scheme_Env *env)<br>
> scheme_initialize(Scheme_Env *env)<br>
> scheme_module_name()<br>
><br>
> Each one of these functions are known to the linker. Inside the Foo_ext.cpp<br>
> file, I have these three functions implemented. But in order to use<br>
> Bar_ext.cpp I have to implement them as well, which means I have multiple<br>
> declarations to the same function. So my Bar_ext.cpp file would Ideally look<br>
> something like this:<br>
><br>
> Bar_ext.cpp<br>
> scheme_reload(Scheme_Env *env)<br>
> {<br>
>  /* Bar _ext reload stuff */<br>
>     Foo_ext.scheme_reload(env)<br>
> }<br>
><br>
> Currently, the only way I see to solve this is to use a bunch of ifdefs, but<br>
> I was curious if there was a more elegant solution.<br>
><br>
> Thanks!<br>
><br>
> On Thu, Feb 6, 2014 at 2:48 AM, David T. Pierson <<a href="mailto:dtp@mindstory.com">dtp@mindstory.com</a>> wrote:<br>
>><br>
>> On Wed, Feb 05, 2014 at 02:16:54PM -1000, Cody Eilar wrote:<br>
>> > > But what I really want is:<br>
>> > ><br>
>> > > Foo_ext.h:<br>
>> > ><br>
>> > > func1_racket_ext() { /*... do racket stuff and run func1() */}<br>
>> > ><br>
>> > > /* Scheme initializes etc... */<br>
>> > ><br>
>> > ><br>
>> > > Bar_ext.cpp:<br>
>> > > #include "Foo_ext.h"<br>
>> > ><br>
>> > > func2_racket_ext() {/* ... do more racket stuff and run func2() /*}<br>
>><br>
>> Disclaimer: I know nothing about Racket extensions.<br>
>><br>
>> In C++, if you want to be able to call a function from multiple .cpp<br>
>> files, you typically put the *declaration* in a header:<br>
>><br>
>>   void func1_ext(void);<br>
>><br>
>> The definition would still go in a .cpp file:<br>
>><br>
>>   void func1_ext(void)<br>
>>   {<br>
>>     /*...*/<br>
>>   }<br>
>><br>
>> You typically only put the definition in a header if you want to make an<br>
>> inline function.  It doesn't seem like you want an inline function here.<br>
>><br>
>> Does that help?<br>
>><br>
>> David<br>
><br>
><br>
><br>
</div></div>> ____________________<br>
>   Racket Users list:<br>
>   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
><br>
</blockquote></div><br></div>