我该如何处理D中的C字符串?

时间:2009-08-21 20:31:45

标签: string d

我正在将C库的头文件转换为D模块,并且想知道我应该如何处理C字符串。

使用DMD 1,这有效:

void f(char* s);  // Definition for C library's function.

但是使用DMD 2(我个人使用,但我希望这两个模块都适用)字符串是const,所以要使用模块来获取相同的代码需要

void f(const(char)* s);  // Definition for C library's function.

我该怎么办?只需使用char*并使“客户端”代码以某种方式使字符串变得可变?或者根据编译代码的编译器版本修改类型?如果是前者,那么使它们变得可变的最佳方法是什么?我以为.dup会这样做,但编译器没有它的条。如果是后者,我该怎么做呢?我试过这个:

version (D_Version2) {
    alias const(char)* charptr;
} else {
    alias char* charptr;
}

void f(charptr s);

但是,DMD 2版本不是DMD 1的有效代码,版本块中的所有代码必须是编译器编译代码的有效代码,即使代码不包含在生成的可执行文件中也是如此。所以目前代码在两者中编译,但你必须首先修改别名,你可以想象,这是不理想的。

2 个答案:

答案 0 :(得分:5)

您可以使用mixin构造来使用在所有版本中无效的特定于语言版本的代码。例如:

static if(version_major<2)
{
    alias char* charptr;
}
else
{
    mixin("alias const(char)* charptr;");
}

关于你的实际问题,我建议做与将C库与C ++接口时相同的做法 - 为D2定义const(char)*和D1的char*类型,但只在适当的时候使用它(对于例如,如果函数需要char*来写入缓冲区,那么将const(char)*命名为“charptr”通用名称可能不合适。 LPCSTR可以工作;)

我不明白“让它们成为可变的最好方法是什么”这个问题。

答案 1 :(得分:-1)

不要使用mixins,这是错误的工具。你真正需要的是'版本'语句,你可以在条件编译页面中阅读它:http://www.digitalmars.com/d/2.0/version.html

它不会编译/查看针对不同版本的代码。这允许为不同的D版本或不同的操作系统构建不同的代码,不同的任何代码。

Mixins可能有效,但它是一个繁重的工具,没有突出显示的代码(在引号内),只是过于复杂的事情。版本声明非常适合此问题。