Up to date

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

C++-Verwendungsrichtlinien

Hintergrund

Seit Godot 4.0 wird in der gesamten Codebasis eine Untermenge des C++17-Standards verwendet. Obwohl modernes C++ viele Möglichkeiten bietet, schnelleren, besser lesbaren Code zu schreiben, haben wir uns aus einigen Gründen dafür entschieden, unsere Verwendung von C++ auf eine Untermenge zu beschränken:

  • Das Reviewen von Code in Online-Editoren wird dadurch erleichtert. Der Grund dafür ist, dass die Mitwirkenden an der Engine nicht immer Zugang zu einer vollwertigen IDE haben, wenn sie den Code reviewen.

  • Der Code wird für Anfänger (die vielleicht keine professionellen C++-Programmierer sind) leichter verständlich. Die Codebasis von Godot ist dafür bekannt, dass sie leicht zu erlernen ist, und wir möchten, dass das auch so bleibt.

Damit Ihr Pull Request gemergt werden kann, muss er den hier beschriebenen C++-Verwendungsrichtlinien entsprechen. Natürlich können Sie Features, die hier nicht erlaubt sind, in Ihren eigenen C++-Modulen oder GDExtensions verwenden.

Bemerkung

Vor Godot 4.0 galt in der gesamten Codebasis der C++03-Standard, mit einer Handvoll C++14-Erweiterungen. Wenn Sie einen Pull Request für den 3.x-Branch und nicht für den master-Branch einreichen, darf Ihr Code keine C++17-Features verwenden. Stattdessen muss Ihr Code mit einem C++14-Compiler erstellt werden können.

Die folgenden Richtlinien gelten nicht für Abhängigkeiten von Drittanbietern, obwohl wir im Allgemeinen kleine Bibliotheken den größeren Lösungen vorziehen. Siehe auch Bewährte Praktiken für Engine-Entwickler.

Siehe auch

Siehe Richtlinien für den Codestil für Formatierungsrichtlinien.

Unzulässige Features

Jedes Feature, das unten nicht aufgeführt ist, ist erlaubt. Die Verwendung von Features wie constexpr-Variablen und nullptr wird empfohlen, wenn möglich. Versuchen Sie dennoch, den Gebrauch moderner C++-Features konservativ zu halten. Ihre Verwendung muss einem echten Zweck dienen, wie z.B. der Verbesserung der Lesbarkeit des Codes oder der Performance.

STL (Standard Template Library)

Wir erlauben nicht die Verwendung der STL, da Godot (unter anderem) seine eigenen Datentypen bereitstellt. Siehe Warum verwendet Godot nicht die STL (Standard Template Library)? für weitere Informationen.

Das bedeutet, dass Pull Requests nicht std::string, std::vector und dergleichen verwenden sollten. Verwenden Sie stattdessen die Datentypen von Godot, wie unten beschrieben:

  • Verwenden Sie String anstelle von std::string.

  • Verwenden Sie Vector anstelle von std::vector. In einigen Fällen kann LocalVector als Alternative verwendet werden (fragen Sie zuerst die Core-Entwickler).

  • Verwenden Sie Array anstelle von std::array.

Bemerkung

Godot verfügt auch über einen List-Datentyp (eine Linked-List). List wird zwar bereits in der Codebasis verwendet, hat aber in der Regel eine schlechtere Performance als andere Datentypen wie Vector und Array. Daher sollte List in neuem Code vermieden werden, sofern dies nicht notwendig ist.

auto-Keyword

Bitte verwenden Sie nicht das Keyword auto für die Typinferenz. Es kann zwar Wiederholungen vermeiden, aber es kann auch zu verwirrendem Code führen:

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

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

Beachten Sie, dass die Hover-Dokumentation für die Reviewer von Pull Requests oft nicht ohne Weiteres verfügbar ist. In den meisten Fällen werden die Reviewer den Online-Viewer von GitHub verwenden, um Pull Requests zu reviewen.

Wir haben uns dafür entschieden, auto zu verbieten, anstatt es von Fall zu Fall zu erlauben, um zu vermeiden, dass wir über schwierige Grenzfälle entscheiden müssen. Wir danken Ihnen für Ihr Verständnis.

Lambda-Ausdrücke

Lambda-Ausdrücke sollten konservativ verwendet werden, und nur, wenn sie den Code effektiv schneller oder einfacher machen und die Lesbarkeit nicht beeinträchtigen. Bitte fragen Sie, bevor Sie Lambdas in einem Pull Request verwenden.

#pragma once-Direktive

Um dem bestehenden Stil zu folgen, verwenden Sie bitte die Standard #ifdef-basierten Include-Guards anstelle von #pragma once in neuen Dateien.

Siehe auch

Siehe Header-Includes für Richtlinien zur Sortierung von Includes in C++ und Objective-C Dateien.