On Saturday, 4 November 2023 at 14:21:49 UTC, Paul Backus wrote:
[...]

`extern(C++)` functions use C++ name mangling, which includes the types of the parameters in the mangled name. However, since C++ does not have a built-in slice type like D's `T[]`, there is no valid C++ mangling for a D slice. Because of this, it is impossible to compile an `extern(C++)` function that has a D slice as a parameter.

As a workaround, you can convert the slice to a `struct`:

[...]

I use another workaround myself:

```d
extern (C++) struct List(T) { // or extern (C)
        T[] self;
        alias self this;
}

extern (C++) void hello(List!ubyte arg) {
        import std.stdio;
        writeln(arg);
}
```

but it means adding a lot of edge cases to the mixins I use for bindings while showing that C++ can express D arrays.

(translated to

```c++
template <typename T>
struct List final
{
    _d_dynamicArray< T > self;
    List()
    {
    }
};

extern void hello(List<uint8_t > arg);
```

)

Reply via email to