将D字符串转换为C char*

Dr.*_*eon 3 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

知道出了什么问题吗?

And*_*vić 5

您可以使用:

import std.utf;

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


Vla*_*eev 5

问题是,当它传递一个字符串时yyfilename的返回值toStringz有不同的const限定符.filename是不可变的(D string是别名immutable(char)[]),但是yyfilename没有任何const限定符,因此是可变的.

您有两种选择:

  1. 如果您知道yyfilename在程序的其他地方不会修改,则应将其声明为const(char)*而不是char*.
  2. 否则,您应该filename在转换时创建一个副本:toUTFz!(char*)(filename).