In that code, for further safety, I'd like to make it not possible (without a cast) code like this (here toStringz doesn't get called): strcmp(Cstring(s1.ptr), Cstring(s2.ptr));
So I think this code is a bit better: import std.string: toStringz; struct Cstring { const(char)* ptr; // const(ubyte)* ? static Cstring opCall(string s) { Cstring cs; cs.ptr = toStringz(s); return cs; } } extern(C) Cstring strcmp(Cstring s1, Cstring s2); void main() { auto s1 = "abba"; auto s2 = "red"; auto r2 = strcmp(Cstring(s1), Cstring(s2)); } Lars T. Kyllingstad: > but I think it should wrap a ubyte*, not a char*. The reason for this is > that D's char is supposed to be a UTF-8 code unit, whereas C's char can > be anything. Right. But toStringz() returns a const(char)*, so do you want to change toStringz() first? Bye, bearophile