将D字符串转换为C char*

3

基本上这就是我需要的:

  • 我有一个外部的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*

有任何想法出了什么问题吗?


1
我完全不了解D语言,但是“immutable”这个部分表明一个恰当放置的const可能会修复它。也许是extern (C) extern __gshared const char* yyfilename - ruakh
1
const(char)* yyfilename 是你想要的语法 - 一个指向常量数据的可变指针。 - Adam D. Ruppe
@AdamD.Ruppe 嗯,这也行!;-) - Dr.Kameleon
2个回答

5

您可以使用:

import std.utf;

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

是的,是的,是的!就是这样。 (嗯,很明显我需要提高我的谦逊D技能...)非常感谢! :-) - Dr.Kameleon

5
问题在于,yyfilename 和当它传递一个字符串时的 toStringz 的返回值具有不同的const限定符。filename 是不可变的(D中的 string 是对 immutable(char)[] 的别名),但是 yyfilename 没有任何 const 限定符,因此是可变的。
你有两个选择:
  1. 如果你知道 yyfilename 不会在程序的其他地方被修改,那么你应该将其声明为 const(char)* 而不是 char*
  2. 否则,当转换它时应该创建一个副本: toUTFz!(char*)(filename)

非常感谢。我决定选择这个作为答案,因为(虽然两个都可以工作),但这个更有效地解决了主要问题。;-) - Dr.Kameleon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接