对于这个特定的问题:
这是因为 mktemp 需要写入字符串。从 mktemp(3) 开始:
模板的最后六个字符必须是 XXXXXX,并且这些字符被替换为使文件名唯一的字符串。由于会被修改,模板不能是字符串常量,而应该声明为字符数组。
因此,您在这里要做的是使用 char[] 而不是字符串。我会去:
import std.stdio;
void main() {
import core.sys.posix.stdlib;
// we'll use a little mutable buffer defined right here
char[255] tempBuffer;
string name = "alphaXXXXXX"; // last six X's are required by mktemp
tempBuffer[0 .. name.length] = name[]; // copy the name into the mutable buffer
tempBuffer[name.length] = 0; // make sure it is zero terminated yourself
auto tmp = mktemp(tempBuffer.ptr);
import std.conv;
writeln(to!string(tmp));
}
通常,可以通过以下两种方式之一来创建可变字符串:一种是 .dup 某些东西,另一种是像我上面所做的那样使用堆栈缓冲区。
toStringz
不关心输入数据是否可变,它总是返回不可变的(显然......)。但是自己做很容易:
auto c_str = ("foo".dup ~ "\0").ptr;
这就是你的做法, .dup 制作一个可变副本,并自己附加零终止符以确保它在那里。
string name = "alphaXXXXXX"; // last six X's are required by mktemp
auto tmp = mktemp((name.dup ~ "\0").ptr);