问题 什么是无效[]?


我见过这种类型 void[] 在D文档和函数签名中的一些地方使用。这是什么意思?

我搜索了文档和Google中的数组部分,但没有找到任何结论。我发现所有数组都可以隐式转换为 void[] 类型。它只是一个无类型的数组吗?


7948
2017-12-09 18:24


起源



答案:


void[] 只是一系列的东西。 in void[] 是一个方便的签名,只是将字节写入文件或其他东西,因为它将接受任何类型的数组 - void 意思是这种类型并不重要 in 意思是你没有意义修改或存储它,因此你也可以接受const或不可变数组。

使用一个 void[],你必须首先把它投射到别的东西,通常, ubyte[],因此元素具有允许您索引它的具体大小。 void[].length 作为数组中的总字节数给出,所以如果你只是将一个指针和数据长度传递给一个函数(比如操作系统级文件写入,例如Linux的 write 系统调用),传递 arr.ptr, arr.length 将得到这些字节,而不关心它们代表什么。


12
2017-12-09 18:29



我还应该提到你可能会看到的另一种虚空: void*,这意味着指向任何东西的指针。 void* 在C中对于同类事物很常见 void[] 在D中使用(更多一点,C在某些地方使用void * D也会使用模板或类/接口 - 用于通用数据。) void* 在D中也是可能的,有时可以看到与a配对 TypeInfo 参数,允许运行时泛型。模板通常更好,但D运行时库的某些部分使用void * + TypeInfo对(主要是出于历史原因)。所以你可能会在那里看到它。 - Adam D. Ruppe
也可以看看 forum.dlang.org/post/uhlqqyruigazvpyprgaz@forum.dlang.org - o3o


答案:


void[] 只是一系列的东西。 in void[] 是一个方便的签名,只是将字节写入文件或其他东西,因为它将接受任何类型的数组 - void 意思是这种类型并不重要 in 意思是你没有意义修改或存储它,因此你也可以接受const或不可变数组。

使用一个 void[],你必须首先把它投射到别的东西,通常, ubyte[],因此元素具有允许您索引它的具体大小。 void[].length 作为数组中的总字节数给出,所以如果你只是将一个指针和数据长度传递给一个函数(比如操作系统级文件写入,例如Linux的 write 系统调用),传递 arr.ptr, arr.length 将得到这些字节,而不关心它们代表什么。


12
2017-12-09 18:29



我还应该提到你可能会看到的另一种虚空: void*,这意味着指向任何东西的指针。 void* 在C中对于同类事物很常见 void[] 在D中使用(更多一点,C在某些地方使用void * D也会使用模板或类/接口 - 用于通用数据。) void* 在D中也是可能的,有时可以看到与a配对 TypeInfo 参数,允许运行时泛型。模板通常更好,但D运行时库的某些部分使用void * + TypeInfo对(主要是出于历史原因)。所以你可能会在那里看到它。 - Adam D. Ruppe
也可以看看 forum.dlang.org/post/uhlqqyruigazvpyprgaz@forum.dlang.org - o3o