【问题标题】:D - casting char[] to const char[]D - 将 char[] 转换为 const char[]
【发布时间】:2013-06-02 23:33:10
【问题描述】:

我必须使用探戈。

我正在从文件中读取作为 char[] 表指令的文本。然后我需要通过mixin来执行它。 mixin 作为参数需要字符串或 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[] 它不是那么如何使它工作? :

【问题讨论】:

标签: casting char constants d


【解决方案1】:

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 与可变无关。这与编译时与运行时有关。传递给mixin 的字符串在编译时必须是已知的。通常,这意味着使用函数返回字符串(在这种情况下,它被称为 CTFE 的一部分)或使用枚举(在编译时已知)。变量在编译时是未知的,因此通常不能使用。但是,您的const 版本很幸运,因为编译器知道该值永远不会改变,并且该值是直接初始化的,因此它知道它是什么,并且让您侥幸逃脱。如果你有

const char[] tab2 = foo();

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

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

如果要将文件的内容放入mixin,则需要使用字符串导入。例如

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

而且你需要告诉编译器使用-J标志在哪个目录中找到foo.txt

【讨论】:

  • @CSharpBeginner 更新了有关从文件读取的信息。
  • 我怀疑你会使用 C:/dmd/windows/bin 文件夹来存储带有一些你想要混合的代码的文件......它可能会在其他地方。
  • 我在设置这个 -J 标志时遇到问题:/ 我得到了文件“test.d”,其中包含我得到 mixin(import("tekst.txt")) 和另一个文件“tekst.txt”的代码“我得到了简单的 for 循环。这两个文件我在同一个目录“C:\dmd\windows\bin”中。当我尝试像这样编译和使用 -J 时:“dmd test.d -Jpath=C:\dmd\windows\bin”出现错误,称为“文件 tekst.txt 找不到或不在使用 -J 指定的路径中" ,有什么建议为什么会发生这种情况?
  • @CSharpBeginner 使用dmd test.d -JC:\dmd\windows\binpath 不是标志的一部分。它是要作为字符串导入的文件所在目录的路径。我同意 DejanLekic 的观点,即将您想要混合的文件作为字符串放入您的 dmd 目录是一个非常糟糕的主意。这些是您项目的一部分,而不是 dmd 的一部分。
  • 非常感谢乔纳森的帮助,你太棒了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多