我正在将C库的头文件转换为D模块,并且想知道我应该如何处理C字符串.
使用DMD 1,这有效:
void f(char* s); // Definition for C library's function.
Run Code Online (Sandbox Code Playgroud)
但是使用DMD 2(我个人使用,但我希望这两个模块都适用)字符串是const,所以要使用模块工作需要相同的代码
void f(const(char)* s); // Definition for C library's function.
Run Code Online (Sandbox Code Playgroud)
我该怎么办?只是使用char*
并使"客户端"代码以某种方式使字符串变得可变?或者根据编译代码的编译器版本修改类型?如果是前者,那么使它们变得可变的最佳方法是什么?我以为.dup会这样做,但编译器没有它的条.如果是后者,我该怎么做呢?我试过这个:
version (D_Version2) {
alias const(char)* charptr;
} else {
alias char* charptr;
}
void f(charptr s);
Run Code Online (Sandbox Code Playgroud)
但是,DMD 2版本不是DMD 1的有效代码,版本块中的所有代码必须是编译器编译代码的有效代码,即使代码不包含在生成的可执行文件中也是如此.所以目前代码编译在两者中,但你必须首先修改别名,你可以想象,这是不理想的.
您可以使用mixin构造来使用在所有版本中无效的特定于语言版本的代码.例:
static if(version_major<2)
{
alias char* charptr;
}
else
{
mixin("alias const(char)* charptr;");
}
Run Code Online (Sandbox Code Playgroud)
关于你的实际问题,我建议你做同样的事情,就像用C++连接C库一样 - const(char)*
为D2和char*
D1 定义一个类型,但只在适当的时候使用它(例如,如果一个函数需要char*
一个缓冲区来写入,将const(char)*
某些东西命名为"charptr"的通用名称可能不合适.LPCSTR
可以工作;)
我不明白"什么是使它们变得可变的最好方法"的问题.