Question about function aliases
Gary Willoughby
dev at nomad.so
Thu Dec 12 02:41:43 PST 2013
On Thursday, 12 December 2013 at 00:51:56 UTC, dnewbie wrote:
> On Wednesday, 11 December 2013 at 23:42:44 UTC, Gary Willoughby
> wrote:
>> For example i have some C code like this:
>>
>> typedef void (Tcl_InterpDeleteProc) _ANSI_ARGS_((ClientData
>> clientData, Tcl_Interp *interp));
>>
>> void Tcl_CallWhenDeleted(Tcl_Interp* interp,
>> Tcl_InterpDeleteProc* proc, ClientData clientData);
>>
>>
>> I intend on converted this to D thus:
>>
>> alias void function(ClientData clientData, Tcl_Interp* interp)
>> Tcl_InterpDeleteProc;
>>
>> void Tcl_CallWhenDeleted(Tcl_Interp* interp,
>> Tcl_InterpDeleteProc* proc, ClientData clientData);
>>
>> Is it correct keeping the * with the Tcl_InterpDeleteProc
>> parameter or do i remove it? Is the alias above a function
>> pointer?
>>
>> To call this function can i use a function literal for the
>> Tcl_InterpDeleteProc parameter? or do i need to pass an
>> address of the function?
>
> It's a function pointer.
> Test:
>
> import std.stdio;
> alias extern(C) void function(void*) Callback;
>
> void Call(Callback c)
> {
> c(c);
> }
>
> extern(C) void callback(void* v)
> {
> writefln("v: %04X", v);
> }
>
> void main()
> {
> Callback c = &callback;
> Call(c);
> writefln("c: %04X", c);
> }
So i guess i need to remove the * after the Tcl_InterpDeleteProc
parameter from the C declaration when porting it?
Using the * my tests show an error which i guess is caused by the
declaration expecting a pointer to a function pointer.
Here is my test:
import std.stdio;
// Function pointer type.
alias void function(string text, int level) Tcl_InterpDeleteProc;
// A function that uses the function pointer type for a parameter.
void test(Tcl_InterpDeleteProc func) // <-- no *
{
(*func)("Hello", 100);
}
// A callback that going to be used as the parameter.
void callback(string text, int level)
{
writefln("text : %s", text);
writefln("level: %d", level);
}
// test.
void main(string[] args)
{
// Use address of function.
test(&callback);
// Function literal passed as pointer.
test(function(string text, int level){
writefln("text : %s", text);
writefln("level: %d", level);
});
}
After testing i've decided on the following code for the port.
Would you agree this is correct?
alias void function(ClientData clientData, Tcl_Interp* interp)
Tcl_InterpDeleteProc;
extern (C) void Tcl_CallWhenDeleted(Tcl_Interp* interp,
Tcl_InterpDeleteProc proc, ClientData clientData);
More information about the Digitalmars-d-learn
mailing list