好吧,基本上这就是我需要的:
extern(al)char *变量代码:
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)
知道出了什么问题吗?
您可以使用:
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)
问题是,当它传递一个字符串时yyfilename的返回值toStringz有不同的const限定符.filename是不可变的(D string是别名immutable(char)[]),但是yyfilename没有任何const限定符,因此是可变的.
您有两种选择:
yyfilename在程序的其他地方不会修改,则应将其声明为const(char)*而不是char*.filename在转换时创建一个副本:toUTFz!(char*)(filename).