On 2017-06-22 00:19, H. S. Teoh via Digitalmars-d wrote:

The code template says:

        extern(C) double funcImpl(double x, double y)

But the function pointer type is declared as:

        alias FuncImpl = double function(double, double);

Notice the lack of `extern(C)` in the latter. The call to dlsym(), of
course, simply casts the return value to FuncImpl, because dlsym()
doesn't know anything about what the symbol's type might be, and just
returns void*:

        FuncImpl impl = cast(FuncImpl) dlsym(lib, symbol);

You could also add a template that generates a function pointer based on the actual function, "funcImpl" in this case. Something like:

extern(C) double funcImpl(double x, double y);

alias FuncImpl = generateFunctionPointer!(funcImpl);

generateFunctionPointer would evaluate to a function pointer type with the correct signature and calling conventions by inspecting the passed in function symbol. This would avoid that the signatures get out of sync and is a bit more DRY as well.

--
/Jacob Carlborg

Reply via email to