D 語言 / DLang 2.100.0 釋出

2022-05-17 09:00:32

D 語言 / DLang 2.100.0 已正式釋出。此版本包含 22 個主要更改和 179 個已修復的 Bugzilla 問題。

主要變化

  • 改進 C++ header gen
  • @mustuse強制返回型別錯誤檢查的新屬性
  • 支援 contract 不變版本識別符號
  • 新增 .tupleof 靜態陣列的屬性
  •  引入新函數
  • 引入不可傳遞的 inout 返回,以及更多改進

使用 ImportC 在 C 原始碼中匯入 D 程式碼模組

從 D 2.099.0 開始,可通過__import 關鍵字直接將 D 程式碼模組匯入 C 檔案。

// dsayhello.d
import core.stdc.stdio : puts;

extern(C) void helloImport() {
    puts("Hello __import!");
}
// dhelloimport.c
__import dsayhello;
__import core.stdc.stdio : puts;

int main(int argc, char** argv) {
    helloImport();
    puts("Cool, eh?");
    return 0;
}

使用如下程式碼進行編譯:

dmd dhelloimport.c dsayhello.d

此外還可匯入已經通過 ImportC 編譯過的 C 程式碼模組:

// csayhello.c
__import core.stdc.stdio : puts;

void helloImport() {
    puts("Hello _import!");
}
// chelloimport.c
__import csayhello;
__import core.stdc.stdio : puts;

int main(int argc, char** argv) {
    helloImport();
    puts("Cool, eh?");
    return 0;
}

使用如下程式碼進行編譯:

dmd chelloimport.c csayhello.c

引入丟擲表示式 (throw expression)

在 D 語言的生命週期中,throw 屬於宣告 (statement ),不能在表示式中使用,因為表示式必須有一個型別,而由於 throw 不返回值,所以沒有合適的型別,這導致它不能使用以下語法。

(string err) => throw new Exception(err);

只能使用如下的方案:

(string err) { throw new Exception(err); }

不過從 D 2.099.0 開始,以下程式碼片段可通過編譯:

void foo(int function() f) {}

void main() {
    foo(() => throw new Exception());
}

展開閱讀全文