On Saturday, 4 November 2023 at 03:00:49 UTC, Dadoum wrote:
I was wondering why C++ linkage forbids strings as arguments while we can with the C one.

With C linkage, it's translated to a template that's defined in the automatically generated header, but it just doesn't compile in C++.

`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`:

```d
struct DSlice(T)
{
    T* ptr;
    size_t length;

    T[] opIndex() => ptr[0 .. length];
}

DSlice!T toDslice(T)(T[] slice)
{
        return DSlice!T(slice.ptr, slice.length);
}

extern(C++) void hello(DSlice!(const(char)) arg)
{
    import std.stdio;
    writeln(arg[]);
}

void main()
{
        const(char)[] greeting = "hello";
        hello(greeting.toDslice);
}
```

Reply via email to