【发布时间】:2015-08-26 07:37:30
【问题描述】:
我正在学习 D 语言(我很了解 C++)...我想做一些 Windows 特定的东西,所以我写这个只是为了尝试 API:
import core.sys.windows.windows;
import std.stdio;
string name()
{
char buffer[100];
uint size = 100;
GetComputerNameA(&buffer[0], &size);
return buffer;
}
void main()
{
writeln(name());
}
我收到了我的退货声明:
test.d(11): Error: cannot implicitly convert expression (buffer) of type char[100] to string
好的,在 C++ 中它会调用构造函数来创建一个字符串。它说是隐式的,所以让我们用 C 风格的转换来转换它:return (string)buffer;。
test.d(11): Error: C style cast illegal, use cast(string)buffer
嗯,好的,我记得,不同的语法。
return cast(string)buffer;
现在它编译了,但我得到了垃圾。
我认为这是因为它在字符串中存储了一个指向临时缓冲区的指针。我不想这样做,我想将字符复制到一个字符串中,但烦人的是我似乎找不到如何做到这一点?
所以问题:
如何从正确分配存储的 char 数组构造实际字符串? (复制字符)
像这样分配随机大小的缓冲区并转换为字符串似乎很难看。在 D 中是否有适当的方法来做到这一点? (我说的是一般性问题,而不是专门针对这个 API 以防万一有另一个 API 来获取计算机名称)。
如果手册中回答了其中任何一个问题,我应该在哪里查找详细信息?
感谢您的帮助和建议。
【问题讨论】:
-
你能不能在转换之前检查
buffer的实际值,因为转换应该不会失败。 -
转换工作......如果我在函数中打印它......如果我返回字符串它会失败,大概是因为它仍然引用临时缓冲区。
-
@Bauss,不,不应该。事实上 2.068 中止编译:
Error: escaping reference to local variable buffer。 -
@sigod 使用 2.068 在 windows 上编译原始代码没有任何错误或警告...
-
@jcode, imgur.com/fo0NPxW
标签: d