Wir haben bei der Arbeit auf einen Compiler umgestellt, der den C++17-Standard unterstützt.
Wir fangen aktiv an, verschiedene Extras aus diesem Standard zu verwenden.
Zufrieden mit dem [[fallthrough]] -Attribut für Switch-Case-Konstrukte.
Das Wesentliche an diesem Attribut ist, dass es anzeigt, dass die break -Anweisung im switch case -Konstrukt absichtlich weggelassen wurde und dass dies kein Programmierfehler ist.
Der Punkt ist, dass das Konstrukt switch case die Ausführung von Pass-Through-Code durch alle case -Optionen ermöglicht, es sei denn, es wurde eine break -Anweisung hinzugefügt.
Hier ist eine klassische Anwendung dieses Designs
int x = 100; bool check_x() { switch (x) { case 0: return true; case 50: x = 0: break; case 100: return false; default: return false; } }
Und hier ist eine Variante mit End-to-End-Codeausführung, wenn die break-Anweisung weggelassen wird.
int x = 100; bool check_x() { switch (x) { case 0: case 50: case 100: return true; default: return false; } }
In diesem Fall wird für alle Werte 0, 50, 100 der gleiche Code ausgeführt. Der Compiler kann jedoch eine Warnung ausgeben, und andere Programmierer, die Ihren Programmcode möglicherweise in Zukunft pflegen, können dies als Fehler betrachten.
Das Attribut fallthrough wurde eingeführt, um anzuzeigen, dass die break-Anweisung absichtlich übersprungen wurde. Und dann sieht der Code so aus
int x = 100; bool check_x() { switch (x) { case 0: [[fallthrough]]; case 50: [[fallthrough]]; case 100: return true; default: return false; } }
Es ist auch möglich, dem Compiler mitzuteilen, dass die Standardanweisung ebenfalls absichtlich weggelassen wurde.
int x = 100; bool check_x() { switch (x) { case 0: [[fallthrough]]; case 50: [[fallthrough]]; case 100: return true; case 105: [[fallthrough]]; } return false; }
Im Allgemeinen ist das Ding sehr nützlich, was Unstimmigkeiten und den menschlichen Faktor beseitigt.