将D字符串转换为C char *

时间:2014-03-14 18:23:13

标签: c++ c d dmd

嗯,基本上就是我所需要的:

  • 我有一个extern(al)char *变量
  • 我想指定D字符串的值

代码:

import std.stdio;
import std.string;
import core.stdc.stdlib;

extern (C) int yyparse();
extern (C) extern __gshared FILE* yyin;
extern (C) extern __gshared char* yyfilename;

void main(string[] args)
{
    string filename = args[1];

    auto file = File(filename, "r");

    yyfilename = toStringz(filename);
    yyin = file.getFP();

    yyparse();
}

但是,toStringz函数会返回此错误:

main.d(15): Error: cannot implicitly convert expression (toStringz(filename)) of type immutable(char)* to char*

知道出了什么问题吗?

2 个答案:

答案 0 :(得分:5)

您可以使用:

import std.utf;

void main()
{
    string filename;
    char* yyfilename;
    yyfilename = toUTFz!(char*)(filename);
    // yyfilename = filename.toUTFz!(char*);  // or with UFCS syntax
}

答案 1 :(得分:5)

问题是yyfilenametoStringz在传递字符串时的返回值具有不同的const限定符。 filename是不可变的(D stringimmutable(char)[]的别名),但是yyfilename没有任何const限定符,因此是可变的。

您有两种选择:

  1. 如果您知道yyfilename不会在您的计划的其他位置进行修改,则应将其声明为const(char)*而不是char*
  2. 否则,您应该在转换filename时创建toUTFz!(char*)(filename)的副本:{{1}}。