D - 将char []转换为const char []

时间:2013-06-02 23:33:11

标签: casting char const d

我必须使用探戈。

我正在从文件中读取一个文本,这是一个指向char []表的指令。然后我需要通过mixin执行它。 mixin作为参数需要string或const char []。如何将char []转换为const char []?

import tango.io.Stdout;
import tango.io.Console;

void main(char[][] args)
{
int x = 3;

char[] tab = "x = 5;"; 
mixin(tab);                 // throw error 

const char[] tab2 = "x = 5;";
mixin(tab2);               // here it's ok
}

错误:错误:mixin的参数必须是字符串,而不是(制表符)

我知道它必须是字符串,但发送const char []它正在工作,发送标准char []它不是如此使它工作? :其中

1 个答案:

答案 0 :(得分:2)

char[]隐含地投射到const char[]。不需要演员表。

auto foo(const char[]) {...}

auto foo(const(char)[]) {...}

将同时接受char[] - char[]const(char)[]immutable(char)[]const char[]immutable char[]的任何可变性变体。 mutable和immutable一般都会隐式转换为const

编辑(添加到问题代码后添加):

实际上,我很震惊你的第二行编译。这与const vs mutable无关。这与编译时与运行时有关。传递给mixin的字符串必须在编译时知道。通常,这意味着使用函数返回字符串(在这种情况下,它被称为CTFE的一部分)或使用枚举(在编译时可以知道)。变量在编译时是未知的,因此通常不能使用。但是,你幸运的是你的const版本,因为编译器知道值永远不会改变,并且值是直接初始化的,所以它知道它是什么,它让你逃脱它。如果你有

const char[] tab2 = foo();

并且foo已经返回了您想要使用的字符串,mixin将无法像第一个那样编译。

mixin的字符串通常应直接传递给mixin,从函数返回(称为CTFE的一部分),或者是枚举。

如果要将文件的内容放在mixin中,则需要使用字符串导入。 e.g。

mixin(import("foo.txt"));

您需要告诉编译器在使用-J标志时找到 foo.txt 的目录。