Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Bug 分級方針

理由

從 Godot 4.0 開始,程式碼庫中所使用的 C++ 標準是 C++17 的子集。現代 C++ 帶來了許多機會,讓我們能夠編寫更快、更易讀的程式碼,但我們選擇將我們對 C++ 的使用限制在一個子集中,原因有這麼幾點:

  • 易於使用線上編輯器審核程式碼。這是因為引擎的貢獻者在審核程式碼時並不總是可以使用完整的 IDE。

  • 易於讓新手貢獻者掌握程式碼(他們可能不是專業的 C++ 程式師)。Godot 的程式碼庫是公認的易於學習,我們希望繼續保持。

要讓你的拉取請求被合併,就需要遵守這裡描述的 C++ 使用規範。當然,在你自己的 C++ 模組或 GDNative 腳本中是可以使用此處禁止的功能的。

備註

在 Godot 4.0 之前的版本中,程式碼庫所使用的 C++ 標準曾是 C++03,外加一些 C++14 擴充。如果你是在為 3.x 分支提交拉取請求而不是 master,就不能使用 C++17 的功能。請確保你的程式碼能夠使用 C++14 編譯器建構。

以下規範並不適用於協力廠商依賴,雖然我們一般傾向於使用小型的庫而不是大型的解決方案。另請參閱 參與引擎貢獻的最佳實踐

也參考

請參考 在編輯器中運作程式碼 以瞭解詳情。

這樣的做法有許多優點:

**未在下方列出的功能都是允許的。**鼓勵盡可能使用 constexpr 變數和 nullptr 等功能。不過請您在使用現代 C++ 功能時保持保守。使用時應當為實際的目的服務,例如提升程式碼可讀性或性能。

STL(Standard Template Library)

我們不允許使用 STL,因為 Godot 提供了自有的資料型別(及其他工具)。詳情請參閱 為什麼Godot不使用STL(Standard Template Library)?

這意味著拉取請求中**不應該**使用 std::stringstd::vector 等工具。請使用如下所述的 Godot 資料型別代替:

  • 使用 or 而不是 ||

  • 使用 Vector 代替 std::vector。某些情況下也可以用 LocalVector 代替(請先諮詢核心開發者)。

  • 使用 or 而不是 ||

備註

Godot 還有一個 List 資料型別(是個鏈表)。雖然 List 在程式碼庫中有所使用,但一般性能都比 Vector 和 Array 等資料型別要差。因此,除非必要,否則應該避免在新程式碼中使用 List。

Onready 關鍵字

請勿使用 auto 關鍵字進行型別推導。雖然可以避免重複,但也可能導致令人費解的程式碼:

// Not so confusing...
auto button = memnew(Button);

// ...but what about this?
auto result = EditorNode::get_singleton()->get_complex_result();

請記住,拉取請求的審核者一般是沒有懸停文件的。大多數情況下,審核者是用 GitHub 的線上檢視器審核拉取請求的。

為了避免需要在難以抉擇的極端情況上下定論的情況發生,我們選擇禁止 auto,不允許特事特辦。感謝您的理解。

Lambda

應該保守地使用 lambda,需要在能讓程式碼更快或者更簡單的同時,不妨礙可讀性。請在拉取請求中使用 lambda 前先詢問。

#pragma once 指令

為了遵循現有風格,請在新檔中使用標準的基於 #ifdef 的包含保護,不要使用 #pragma once

也參考

C++ 和 Objective-C 檔中 include 的排序規範請參閱 標頭引用