static_assert
Überprüft eine Softwareassertion zur Kompilierzeit. Wenn der angegebene konstante Ausdruck false ist, zeigt der Compiler die angegebene Meldung an, und bei der Kompilierung tritt der Fehler C2338 auf; andernfalls hat die Deklaration keine Auswirkungen.
static_assert(
constant-expression,
string-literal
);
Parameter
Parameter |
Beschreibung |
---|---|
constant-expression |
Ein ganzzahliger konstanter Ausdruck, der in einen booleschen Wert konvertiert werden kann. Wenn der ausgewertete Ausdruck 0 (false) ist, wird der string-literal-Parameter angezeigt, und bei der Kompilierung tritt ein Fehler auf. Wenn der Ausdruck nicht 0 (true) ist, hat die static_assert-Deklaration keine Auswirkungen. |
string-literal |
Eine Meldung, die angezeigt wird, wenn der constant-expression-Parameter 0 (null) ist. Die Meldung ist eine Zeichenfolge mit Zeichen im Basiszeichensatz des Compilers, d. h. es sind keine Multibyte- oder Breitzeichen. |
Hinweise
Der constant-expression-Parameter einer static_assert-Deklaration stellt eine Softwareassertion dar. Eine Softwareassertion gibt eine Bedingung an, die an einer bestimmten Stelle im Programm "true" sein muss. Wenn die Bedingung "true" ist, hat die static_assert-Deklaration keine Auswirkungen. Wenn die Bedingung "false" ist, tritt bei der Assertion ein Fehler auf, der Compiler zeigt die Nachricht im string-literal-Parameter an, und bei der Kompilierung tritt ein Fehler auf.
Die static_assert-Deklaration testet eine Softwareassertion zur Kompilierzeit. Im Gegensatz dazu testet das assert (CRT)-Makro eine Softwareassertion zur Laufzeit und wirkt sich zur Laufzeit auf Speicherplatz und Zeit aus. Die static_assert-Deklaration ist zum Debuggen von Vorlagen besonders nützlich, da Vorlagenargumente im constant-expression-Parameter aufgenommen werden können.
Der Compiler überprüft die static_assert-Deklaration auf Syntaxfehler, wenn die Deklaration gefunden wird. Der Compiler wertet den constant-expression-Parameter sofort aus, wenn er nicht von einem Vorlagenparameter abhängt. Andernfalls wertet der Compiler den constant-expression-Parameter aus, wenn die Vorlage instanziiert wird. Daher gibt der Compiler möglicherweise eine Diagnosemeldung aus: einmal, wenn die Deklaration gefunden wird, und noch einmal, wenn die Vorlage instanziiert wird.
Sie können das static_assert-Schlüsselwort im Namespace-, Klassen- oder Blockbereich verwenden. (Das static_assert-Schlüsselwort ist technisch gesehen eine Deklaration, obwohl es keine neuen Namen in das Programm einführt, da es im Namespacebereich verwendet werden kann.)
Beschreibung
Im folgenden Beispiel verfügt die static_assert-Deklaration über einen Namespacebereich. Da der Compiler die Größe des Typs void * kennt, wird der Ausdruck sofort ausgewertet.
Beispiel
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Beschreibung
Im folgenden Beispiel verfügt die static_assert-Deklaration über einen Klassenbereich. static_assert überprüft, ob ein Vorlagenparameter ein Plain Old Data (POD)-Typ ist. Der Compiler überprüft die static_assert-Deklaration, wenn sie deklariert wird, wertet den constant-expression-Parameter jedoch nicht aus, bis die basic_string-Klassenvorlage in main() instanziiert wird.
Beispiel
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(tr1::is_pod<CharT>::value,
"Template argument CharT must be a POD type in class template basic_string");
// ...
};
}
struct NonPOD {
NonPOD(const NonPOD &) {}
virtual ~NonPOD() {}
};
int main()
{
std::basic_string<char> bs;
}
Beschreibung
Im folgenden Beispiel verfügt die static_assert-Deklaration über einen Blockbereich. static_assert überprüft, ob die Größe der VMPage-Struktur der Seitengröße des virtuellen Arbeitsspeichers des Systems entspricht.
Beispiel
#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
struct VMPage { // ...
};
int check_pagesize() {
static_assert(sizeof(VMPage) == PAGESIZE,
"Struct VMPage must be the same size as a system virtual memory page.");
// ...
}
// ...
};
Siehe auch
Referenz
Assertion und benutzerdefinierte Meldungen (C++)