Translating C "static arrays" into D?
H. S. Teoh
hsteoh at quickfur.ath.cx
Mon Feb 26 18:26:34 UTC 2018
On Mon, Feb 26, 2018 at 08:07:11PM +0200, ketmar via Digitalmars-d wrote:
[...]
> in C, arrays are *always* decaying to pointers. so
>
> void foo (int x[2])
>
> is the same as
>
> void foo (int* x)
>
> `[2]` is purely informational.
>
> that is, in D it will be:
>
> alias mytype = double*;
Actually, that doesn't work, because in the struct declaration it will
be wrong:
// C
struct S {
double[5] x; // actually occupies the space of 5 doubles
}
// D
struct S {
double* x; // occupies the space of 1 pointer (wrong)
}
Furthermore, declaring it as `double*` breaks existing code ported from
C:
// Original C code:
void foo(mytype x);
mytype z;
foo(z);
// D code:
void foo(double* x); // OK
mytype z; // NG
foo(z); // NG: passes uninitialized pointer
// alternatively:
double[1] z;
foo(z); // NG: need to insert `&` to compile
Eventually I figured out a (hackish) solution to make it work without
silently breaking transliterated C code: declare all function parameters
that take `mytype` as ref. This causes the D compiler to simulate the
array -> pointer degradation semantics but still retain "static array"
semantics in structs and variable declarations, without requiring a
change in syntax.
T
--
Food and laptops don't mix.
More information about the Digitalmars-d
mailing list