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

Does 'D' language supports 'C' like VLA?

'D' 语言是否支持本地分配的 'C',如可变长度数组?

像这样:

void main()
{
    size_t szArr = 3;

    int[szArr] arr;
}

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

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

    int[] a = (cast(int*) alloca(size * int.sizeof))[0 .. size];
    

由于alloca 的工作原理,不能 抽象成一个函数。不过,您可以将其设为混合字符串。

  • 您可以使用静态数组,如其他答案中所述,然后将其切成一定大小。类似于:

    int[1024] buffer;
    int[] runtimeSized = size <= buffer.length ? buffer[0 .. size] : (new int[](size);
    

由于缓冲区的大小是静态的,如果可以的话,你可以对其进行切片,如果不能则创建一个常规数组(或者你可以抛出 "Data too big" 某种异常)。

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

请记住,在函数 returns 之后存储对堆栈数据的引用是无效的,但编译器不会帮助指出您在哪里做的。