static_assert
Überprüft eine Softwareassertion zur Kompilierzeit. Wenn der angegebene Konstantenausdruck lautet false
, zeigt der Compiler die angegebene Meldung an, sofern vorhanden, und die Kompilierung schlägt mit fehler C2338 fehl. Andernfalls hat die Deklaration keine Auswirkung.
Syntax
static_assert( constant-expression, string-literal );
static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)
Parameter
constant-expression(konstanter Ausdruck)
Ein ganzzahliger konstanter Ausdruck, der in einen booleschen Wert konvertiert werden kann. Wenn der ausgewertete Ausdruck null (false) ist, wird der Zeichenfolgenliteralparameter angezeigt, und die Kompilierung schlägt mit einem Fehler fehl. Wenn der Ausdruck "nonzero" (true) ist, hat die static_assert
Deklaration keine Auswirkung.
Zeichenfolgenliteral
Eine Meldung, die angezeigt wird, wenn der Parameter für konstanten Ausdruck null ist. Die Nachricht ist eine Zeichenfolge von Zeichen im Basiszeichensatz des Compilers, d. h. nicht multibyte oder breit.
Hinweise
Der Konstantenausdrucksparameter einer static_assert
Deklaration stellt eine Software assertion 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 Auswirkung. Wenn die Bedingung falsch ist, schlägt die Assertion fehl, zeigt der Compiler die Meldung im Zeichenfolgenliteralparameter an, und die Kompilierung schlägt mit einem Fehler fehl. In Visual Studio 2017 und höher ist der Zeichenfolgenliteralparameter optional.
Die static_assert
Deklaration testet zur Kompilierungszeit eine Software assertion. Im Gegensatz dazu testen die Funktionen "Makro" und _assert und _wassert eine Software assertion zur Laufzeit und verursachen einen Laufzeitaufwand in Raum oder Zeit. Die static_assert
Deklaration ist besonders nützlich für das Debuggen von Vorlagen, da Vorlagenargumente in den Parameter "Konstantenausdruck " eingeschlossen werden können.
Der Compiler untersucht die static_assert
Deklaration auf Syntaxfehler, wenn die Deklaration auftritt. Der Compiler wertet den Parameter für konstanten Ausdruck sofort aus, wenn er nicht von einem Vorlagenparameter abhängt. Andernfalls wertet der Compiler den Parameter "Konstantenausdruck " 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 die static_assert
Schlüsselwort (keyword) im Namespace, in der Klasse oder im Blockbereich verwenden. (Die static_assert
Schlüsselwort (keyword) ist technisch eine Deklaration, obwohl sie keinen neuen Namen in Ihr Programm einführt, da sie im Namespacebereich verwendet werden kann.)
Beschreibung des Namespacebereichs static_assert
Im folgenden Beispiel weist die static_assert
Deklaration den Namespacebereich auf. Da der Compiler die Größe des Typs void *
kennt, wird der Ausdruck sofort ausgewertet.
Beispiel: static_assert
mit Namespacebereich
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Beschreibung des Klassenbereichs static_assert
Im folgenden Beispiel weist die static_assert
Deklaration den Klassenbereich auf. Die static_assert
Überprüfung, dass ein Vorlagenparameter ein einfacher alter Datentyp (POD) ist. Der Compiler untersucht die static_assert
Deklaration, wenn sie deklariert wird, wertet den Parameter für den Konstantenausdruck jedoch erst aus, wenn die basic_string
Klassenvorlage instanziiert main()
wird.
Beispiel: static_assert
mit Klassenbereich
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(std::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 des Blockbereichs static_assert
Im folgenden Beispiel weist die Deklaration den static_assert
Blockbereich auf. Die static_assert
Überprüfung, ob die Größe der VMPage-Struktur den virtuellen Speicherseiten des Systems entspricht.
Beispiel: static_assert
im Blockbereich
#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
Assertion und benutzerdefinierte Meldungen (C++)
#error-Direktive (C/C++)
assert Macro, _assert, _wassert
Vorlagen
ASCII-Zeichensatz
Deklarationen und Definitionen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für