我正在尝试将一些C代码转换为D,而我遇到了这个问题:
char[] welcome = "\t\tWelcome to the strange land of protected mode!\r\n";
它发出此警告:
main.d:5:18: error: cannot implicitly convert expression ("\x09\x09Welcome to the strange land of protected mode!\x0d\x0a") of type string to char[]
5 | char[] welcome = "\t\tWelcome to the strange land of protected mode!\r\n";
| ^
该如何在不分别键入数组中每个字符的情况下执行此操作?
答案 0 :(得分:4)
如前所述,字符串已经是一个字符数组。实际上,这是string
的定义:
alias string = immutable(char)[];
(来自object.d)
因此string
与char[]
的不同之处仅在于数组的内容为immutable
。
char[]
,而string
也可以工作。welcome[2] = 'x';
可以工作),则使用.dup
将在运行时创建一个副本。const
正确注释,并且不接受指向不可变字符的指针。在这种情况下,可以使用cast
。static char[] s = ['a', 'b', 'c'];
一样直接将字符串文字放置在可写数据段中,但是它可以作为模板或CTFE函数使用。答案 1 :(得分:3)
string
是一个字符数组。字符串文字只是编写字符数组的一种简便方法。字符串文字是不可变的 (只读)。char[] str1 = "abc"; // error, "abc" is not mutable char[] str2 = "abc".dup; // ok, make mutable copy immutable(char)[] str3 = "abc"; // ok immutable(char)[] str4 = str1; // error, str4 is not mutable immutable(char)[] str5 = str1.idup; // ok, make immutable copy
名称字符串的别名为
immutable(char)[]
,因此上述声明可以等效地写为:char[] str1 = "abc"; // error, "abc" is not mutable char[] str2 = "abc".dup; // ok, make mutable copy string str3 = "abc"; // ok string str4 = str1; // error, str4 is not mutable string str5 = str1.idup; // ok, make immutable copy
所以:
char[] welcome = "\t\tWelcome to the strange land of protected mode!\r\n".dup;