Am 20.07.2014 18:37, schrieb bearophile:
Daniel Gibson:

For "normal" functions http://dlang.org/interfaceToC.html tells me to
add a "ref" in the function signature, to tell D to pass it by
reference (couldn't this be implicit for extern (C) functions?)

I don't know why D isn't adapting such things to the needs of C.

Bye,
bearophile

Yeah, IMHO it would indeed make sense to make extern (C) functions behave more like C. They already are different to D functions (different name mangling and, more visibly to the user, varargs behave differently), so why not do it properly? As far as I see it, passing static arrays by value to C functions is never what you want because C just doesn't support it, so why not make it implicit? This also goes the other way round: if I implement an extern (C) function in D (vs just having a function pointer or a declaration of a function implemented in C), D "thinks" it's getting a static array by value when it's really just getting a ref.. And for the varargs case (where I can't just add "ref"), it's totally non-obvious that I have to pass staticArr.ptr instead, so here it would be even more desirable to have that done implicitly.

So what I (naive as I am) would expect extern (C) to do to functions is:
* C name mangling (that's done)
* C-style varargs (also done)
* passing stuff to the function is done as C expects it (not done,
  also: are there other cases than the static array one that are
  different?)
* Disallowing template arguments (because how would I declare and call
  that function in C?) (not done)
* /Maybe/ disallowing types as arguments/return types that are not
  supported by C (D classes; not done)?
  (OTOH, one the C side one could just handle them as void* and pass
  instances around opaquely)

Cheers,
Daniel

Reply via email to