【问题标题】:Can I write a function that takes a static array of chars in D?我可以编写一个在 D 中采用静态字符数组的函数吗?
【发布时间】:2014-09-24 09:25:39
【问题描述】:

例如,我想用这个签名编写一个函数:int foo(char[]) 并使用char[5] x; foo(x) 调用它。

目前我收到一个编译错误,指出 char[] 与 char[5] 不同。

我想写:int foo(uint SIZE)(char[SIZE]),但是我必须在调用 foo 时显式设置长度:foo!5(x) 之前的示例。

编辑:你们是对的,我的函数实际上看起来像foo(ref char[]),我已经声明了它@nogc。我想要做的是用数据填充给定的静态数组。 从更广泛的意义上说,我正在尝试实现一个退化的format 函数,因为标准库肯定在使用 GC,而我不能从我的其他非 GC 代码中调用它。对此也有什么想法吗?

【问题讨论】:

  • 静态数组应该可以隐式转换为动态数组,编译器也可以推断出 SIZE 参数
  • 见底部Arrays。正如@ratchetfreak 所说,T[dim] 隐式转换为T[]。你能发布一个产生这个错误的例子吗?
  • 确实不应该允许隐式转换(除非存在范围转义分析,但事实并非如此) - 它很容易在许多情况下导致崩溃,并且起到打破不变性保证的作用!这是规范中内存安全的一个巨大漏洞,应该修复 - 不要依赖它。相反,当您知道它是安全的(例如将数组传递给不会存储它的函数)时,使用切片运算符显式切片:foo(x[])
  • @ratchetfreak - 这是怎么回事?我应该省略尺寸吗?

标签: garbage-collection d static-array


【解决方案1】:

char[] 确实 not 与 char[5] 相同,但由于隐式转换,没有什么能阻止您将静态数组作为参数传递给具有 char[] 参数的函数。

例子:

module so.d26013262;

import std.stdio;

int getSize(int[] arr) {
    return arr.length;
}

void main(string[] args) {
    int[5] starr;
    int[] dyarr = [1, 3, 2];

    writeln(getSize(starr));
    writeln(getSize(dyarr));
}

输出:

5
3

我的猜测是您在其他地方遇到错误...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-14
    • 2015-08-10
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多