Calling D functions from C

downs default_357-line at yahoo.de
Wed May 28 04:23:52 PDT 2008


BCS wrote:
> Reply to Downs,
> 
>> BCS wrote:
>>
>>> Reply to Matthias,
>>>
>>>> # extern (C) int myFunctionWrapper (char a, int b, char* c)
>>>> # {
>>>> #    return myFunction (a,b,c); // myFunction is a normal D
>>>> function.
>>>> # }
>>> that deserves a template.
>>> I guess I known what to do at lunch today.
>> template Forward(string NAME) {
>> mixin("extern(C) ReturnType!(&"~NAME~")
>> c_"~NAME~"(ParameterTypeTuple!(&"~NAME~") p) {
>> return "~NAME~"(p);
>> }");
>> }
>> Untested, but should work.
>>
>> --downs
>>
> 
> maybe, I'd kind rather not use a mixin for that. (I avoid them wherever
> I can) I'll take real a pass at it later.
> 
> On second look it seem the mixin is needed to make the name work but it
> seem to be over kill for the rest
> 
> // untested
> template Forward(alias NAME)
> {
>  mixin(
>   "extern(C) ReturnType!(&NAME)
> c_"~NAME.stringof~"(ParameterTypeTuple!(&NAME) p) { return NAME(p);}"
>  );
> }
> 
> 
Remember. stringof is not guaranteed to be in any sort of sane format.
For example, the above code would fail if it for some obscure reason contains spaces (or other invalid characters).
If you let the user pass a string, at least you know where the blame lies.

 --downs


More information about the Digitalmars-d-learn mailing list