On 6/26/20 4:15 AM, Jacob Carlborg wrote:
On Friday, 26 June 2020 at 00:30:22 UTC, Denis wrote:
I have a two questions about calling C functions from D.

(1) When passing a D callback to a C function, is there a way to write the code without having to prefix the callback declaration with "extern(C)"?

It's not a big deal adding the prefix to the D function declaration. It just seems odd to me to prefix D code with "extern(C)". For example, the following code works:

  extern(C) void cfunc(void function(int));
  extern(C) void dcallback(int x) {...}        <-- Why extern(C)?

Can this be rewritten, dropping the prefix from the second line? If not, it would be helpful to know why "extern(C)" is needed here too.

No, it cannot be dropped. `extern(C)` is required because C and D are using different calling conventions (D functions are also mangled). For example, D (at least DMD and LDC) are passing the arguments to the function in reverse.

Are you sure? On the ABI page [1] , it says "The extern (C) and extern (D) calling convention matches the C calling convention used by the supported C compiler on the host system."

I'm pretty sure you can use function pointers to D functions for C callbacks, and it should work.


[1] https://dlang.org/spec/abi.html#function_calling_conventions

Reply via email to