4

我正在将 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 的有效代码,并且版本块中的所有代码都必须是编译代码的编译器的有效代码,即使该代码不会包含在生成的可执行文件中。因此,目前代码在两者中都可以编译,但是您必须先修改别名,正如您可以想象的那样,这并不理想。

4

2 回答 2

5

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

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

关于您的实际问题,我建议在将 C 库与 C++ 连接时执行相同的操作 - 定义一个const(char)*用于 D2 和char*D1 的类型,但仅在适当时使用它(例如,如果一个函数需要char*一个缓冲区来写入,可能不适合将const(char)*诸如“charptr”之类的通用名称命名)。LPCSTR可以工作;)

我不明白“使它们可变的最佳方法是什么”问题。

于 2009-08-21T20:46:09.987 回答
-1

不要为此使用 mixins,这是错误的工作工具。您真正需要的是“版本”声明,您可以在此处的条件编译页面中阅读它:http ://www.digitalmars.com/d/2.0/version.html

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

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

于 2010-08-29T08:34:21.657 回答