“D”语言是否像 VLA 一样支持“C”?

AnA*_*ons 3 d

“D”语言是否支持本地分配的“C”(如可变长度数组)?

像这样的东西:

void main()
{
    size_t szArr = 3;

    int[szArr] arr;
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*ppe 5

不,不是这样的运行时变量。您需要使用替代方案:

  • alloca可以分配运行时大小的堆栈空间,就像在 C 中一样,然后对其进行切片。

    int[] a = (cast(int*) alloca(size * int.sizeof))[0 .. size];
    
    Run Code Online (Sandbox Code Playgroud)

由于工作原理,不能将其抽象为函数alloca。不过你可以把它变成一个 mixin 字符串。

  • 您可以使用静态数组,就像其他答案中所述,然后将其切片到一定大小。就像是:

    int[1024] buffer;
    int[] runtimeSized = size <= buffer.length ? buffer[0 .. size] : (new int[](size);
    
    Run Code Online (Sandbox Code Playgroud)

由于缓冲区的大小是静态的,因此如果可以的话可以对其进行切片,如果不能的话则创建一个常规数组(或者您可以抛出某种“数据太大”异常)。

如果您愿意,您可以将其抽象为一个漂亮的小结构,以便于使用。

请记住,在函数返回后存储对堆栈数据的引用是无效的,但编译器不会帮助指出您在何处执行此操作。