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

String 我应该如何处理D中的C字符串?,string,d,String,D,我正在将C库的头文件转换为D模块,我想知道如何处理C字符串 使用DMD 1,这将起到以下作用: void f(char* s); // Definition for C library's function. 但是使用DMD2(我个人使用它,但我希望模块能够同时为这两个模块工作)字符串是常量,因此要使用模块获得相同的代码需要 void f(const(char)* s); // Definition for C library's function. 我该怎么办?只需使用char*并使“

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

使用DMD 1,这将起到以下作用:

void f(char* s);  // Definition for C library's function.
但是使用DMD2(我个人使用它,但我希望模块能够同时为这两个模块工作)字符串是常量,因此要使用模块获得相同的代码需要

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

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

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

static if(version\u major不使用mixin进行此操作,这是用于此作业的错误工具。您真正需要的是“version”语句,您可以在此处的条件编译页面中阅读:


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


mixin可能可以工作,但它是一个沉重的工具,没有突出显示的代码(在引号内)这太复杂了。version语句非常适合这个问题。

再次问候。我应该付钱给你:。mixin技巧不起作用;
错误:标识符'charptr'没有定义。
。这很有意义;我认为实际上没有任何函数使用缓冲区,但我会记住它。re
LPCSTR
:我想我对unix的敏感度会被这件事冒犯的。
cstring
?代码片段对我很有用。你是否
导入了std.compiler
(声明了
version\u major
的模块)?我现在已经导入了;同样的结果。v2.0.31实际上,它甚至对DMD1不起作用。如果我使用
version(D\u Version2){mixin()}else{alias}
DMD 1起作用,但DMD 2得到相同的结果。不过,我是个笨蛋(导入定义:o以上的模块)。“它不会编译/查看不同版本的代码。”绝对不正确。
version
语句是一个AST节点,因此在考虑删除它之前先对其进行解析。语言的更改使有效的D2代码不能解析为D1,并且您不能将不会解析的代码放在
version
语句中。您认为
version
语句的行为类似于C预处理器(无效的定义块甚至没有经过词法分析),而
version
语句的情况并非如此。嗯,您似乎是对的。我使用以下代码对其进行了测试,删除注释时不会出现错误://version(ABCDE)/{int a=[5,4];//}看起来它应该是正确的。这很奇怪,因为可能总是有代码只能为特定版本编译。但是,使用mixin是错误的工具,尽管我们没有更好的工具:O,我认为D是完美的…:p我们的代码解析得很好:它是一个类型、一个标识符和一个数组文本初始化器。That被解析为AST节点就可以了。直到编译器运行语义传递并发现类型不匹配时,它才会出错。|我觉得
version
语句应该在编译过程的早期被认为是实际有用的。