exern (C) linkage problem
bearophile
bearophileHUGS at lycos.com
Tue Jul 20 02:10:47 PDT 2010
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
More information about the Digitalmars-d-learn
mailing list