- 1. Anwendung
Ausnahmen werden während der Programmausführung geworfen, aber wenn ein Fehler während der Programmkompilierung gefunden werden kann, können Sie static_assert verwenden, das Sie darüber informiert, dass der Programmcode an wichtigen Stellen korrigiert werden muss.
Die Verwendung von static_assert würde so aussehen.
static_assert(4<=sizeof(int), "integers are too small"); // проверка размера integer
Die Syntax wäre static_assert(A, B); wo
- A ist eine Bedingung, unter der ein Fehler ausgegeben wird, wenn A gleich false ist
- B ist der Text der Fehlermeldung
Anwendung
static_assert kann nützlich sein, wenn Konstanten und konstante Ausdrücke verwendet werden, die zur Kompilierzeit ausgewertet werden.
Dieser Code überprüft die lokale konstante Geschwindigkeit, die nicht schneller als die Lichtgeschwindigkeit sein kann.
constexpr double C = 299792.458; // km/s, скорость света void f(double speed) { const double local_max = 160.0/(60∗60); // 160 km/h == 160.0/(60*60) km/s static_assert(speed<C,"can't go that fast"); // error: speed должна быть константой static_assert(local_max<C,"не может двигаться быстрее"); // OK }
Sie können diese Überprüfung auch an Schlüsselstellen für Aufzählungen verwenden. Zum Beispiel bei einer solchen Aufzählung.
enum Types { E_BEGIN_TYPES, E_A = E_BEGIN_TYPES, E_B, E_C, E_D, E_END_TYPES = E_D };
Und irgendwo im Code gibt es die folgende Methode oder Funktion
QString getStandardMessage(Types type) { static_assert(E_END_TYPES == 3, "Need to implement method for new type"); switch (type) { case E_A: return "Type A"; case E_B: return "Type B"; case E_C: return "Type C"; case E_D: return "Type D"; default: return "Type is not implemented"; } }
In diesem Fall wissen wir, dass die neuesten Aufzählungen, also E_D oder E_END_TYPES, gleich 3 sind. Und zur Kompilierzeit wird keine Ausnahme ausgelöst. Aber sobald ein neues Mitglied dieser Aufzählung hinzugefügt wird.
enum Types { E_BEGIN_TYPES, E_A = E_BEGIN_TYPES, E_B, E_C, E_D, E_E, // Новый участник перечисления E_END_TYPES = E_E };
Dann gibt static_assert einen Fehler aus, was bedeutet, dass wir vergessen haben, diese Methode zu reparieren. Der Fix wird so aussehen.
QString getStandardMessage(Types type) { static_assert(E_END_TYPES == 4, "Need to implement method for new type"); switch (type) { case E_A: return "Type A"; case E_B: return "Type B"; case E_C: return "Type C"; case E_D: return "Type D"; case E_E: return "Type E"; default: return "Type is not implemented"; } }
In dieser Methode fügen wir eine Codeimplementierung für den E_E-Typ hinzu und korrigieren auch static_assert selbst, sodass es die Anzahl der Mitglieder der Enumeration mit dem neuen Mitglied berücksichtigt.