Statisch geprüft

Inhaltsverzeichnis[Anzeigen]

static_assert ist das Mittel der Wahl in modernem C++, um den Code sicherer zu machen.

static_assert

Der Einsatz von static_assert ist denkbar einfach. static_assert verlangt einen Ausdruck und einen String. Der Ausdruck muss sich zur Übersetzungszeit auf true oder false evaluieren lassen. Evaluiert der Ausdruck zu false, gibt der Compiler den String als Fehlermeldung aus und erzeugt konsequenterweise keine ausführbare Datei.

Ein paar Punkte will ich noch ergänzen, bevor ein kleines Beispiel folgt.

  • Der static_assert Ausdruck wird zur Compilezeit ausgewertet. Es entstehen daher keine Laufzeiteinschränkungen.
  • Ausdrücke, die zur Compilezeit ausgewertet werden können, heißen konstante Ausdrücke. Dazu gibt es mit dem neuen constexpr Bezeichner eine mächtige Geschichte zu erzählen. Dazu aber mehr in einem der folgenden Artikel.
  • static_assert Ausdrücke können in allen Bereichen des Programms angewandt werden. Daher ist es eine gute Idee, die static_assert Ausdrücke in einer Headerdatei zu kapseln, so dass durch das Einbinden der Headerdatei automatisch die Typzusicherungen zur Compilezeit verifiziert werden.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// static_assert.cpp

#include <string>

static_assert(sizeof(void*) == 4 ,"32-bit adressing is required!");
static_assert(sizeof(void*) >= 8 ,"64-bit adressing is required!");

template < typename T, int Line, int Column >
struct Matrix{
   static_assert(Line >= 0, "Line number must be positive.");
   static_assert(Column >= 0, "Column number must be positive.");
   static_assert( Line + Column > 0, "Line and Column must be greater than 0.");
};

int main() {
  
  static_assert(sizeof(int) == sizeof(long int),"int and long int must be of the same length.");
  
  Matrix<int,10,5> intArray;
  Matrix<std::string,3,4> strArray;
  Matrix<double,0,1> doubleArray;
  Matrix<long long,1,0> longArray;
  
  Matrix<char,0,0> charArray;

}

 

Das Programm verwendet static_assert im globalen, (Zeile 5 und 6), aber auch im Klassen- (Zeile 10 - Zeile 12) oder Block-Gültigkeitsbereich (Zeile 17). Eine der beiden Zusicherungen in Zeile 5 und 6 muss zwangsläufig zuschlagen. Die Zusicherungen in der Klassendefinition stellen sicher, dass die Anzahl der Spalten und Zeilen positiv, als auch, dass deren Summe größer als 0 ist. Damit kann die Templateinstanziierung in Zeile 24 nicht gültig sein. Auf meiner Computerarchitektur ist der Datentyp int kleiner als long int. Das hingegen int nicht größer als long int ist, sichert bereits der C++-Standard zu.

Nun fehlt nur noch Ausgabe meines fehlgeschlagenen Compilierungsversuchs.

static assert

Wie geht's weiter?

Die ganze Mächtigkeit von static_assert hängt an dem konstanten Ausdruck, der vom Compiler evaluiert wird. Da trifft es sich äußerst gut, dass mit der neuen Type-Traits Bibliothek eine mächtige Bibliothek zur Verfügung steht. Die Type-Traits Bibliothek erlaubt es, Typabfragen-, vergleiche und sogar -modifikationen zur Compilezeit durchzuführen. Genau davon handelt der nächste Artikel.

 

 

 

 

 

 

title page smalltitle page small Go to Leanpub/cpplibrary "What every professional C++ programmer should know about the C++ standard library".   Hole dir dein E-Book. Unterstütze meinen Blog.

 

Kommentar schreiben


Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare