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