static_assert
Testuje asercji oprogramowania w czasie kompilacji. Jeśli określone wyrażenie stałe to false
, kompilator wyświetla określony komunikat, jeśli został podany, a kompilacja kończy się niepowodzeniem z błędem C2338; w przeciwnym razie deklaracja nie ma wpływu.
Składnia
static_assert( constant-expression, string-literal );
static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)
Parametry
wyrażenie-stałe
Wyrażenie stałe całkowite, które można przekonwertować na wartość logiczną. Jeśli obliczone wyrażenie ma wartość zero (false), zostanie wyświetlony parametr literału ciągu i kompilacja zakończy się niepowodzeniem z powodu błędu. Jeśli wyrażenie jest niezerowe (true), static_assert
deklaracja nie ma wpływu.
literał ciągu
Komunikat wyświetlany, jeśli parametr wyrażenia stałego ma wartość zero. Komunikat jest ciągiem znaków w podstawowym zestawie znaków kompilatora, czyli nie wielobajtowym ani szerokimi znakami.
Uwagi
Parametr wyrażenia stałegostatic_assert
deklaracji reprezentuje asercję oprogramowania. Asercji oprogramowania określa warunek, który ma być spełniony w określonym punkcie programu. Jeśli warunek ma wartość true, static_assert
deklaracja nie ma wpływu. Jeśli warunek ma wartość false, asercji kończy się niepowodzeniem, kompilator wyświetla komunikat w parametrze literału ciągu, a kompilacja kończy się niepowodzeniem z powodu błędu. W programie Visual Studio 2017 lub nowszym parametr literału ciągu jest opcjonalny.
Deklaracja static_assert
testuje asercji oprogramowania w czasie kompilacji. Natomiast asercji Macro i _assert i _wassert funkcje testują asercji oprogramowania w czasie wykonywania i generują koszt czasu wykonywania w przestrzeni lub czasie. Deklaracja jest szczególnie przydatna static_assert
do debugowania szablonów, ponieważ argumenty szablonu można uwzględnić w parametrze wyrażenia stałego.
Kompilator sprawdza deklarację pod kątem static_assert
błędów składni podczas napotkania deklaracji. Kompilator ocenia parametr wyrażenia stałego natychmiast, jeśli nie zależy od parametru szablonu. W przeciwnym razie kompilator oblicza parametr wyrażenia stałego po utworzeniu wystąpienia szablonu. W związku z tym kompilator może wydać komunikat diagnostyczny po napotkaniu deklaracji i ponownie po utworzeniu wystąpienia szablonu.
Słowo kluczowe można użyć static_assert
w przestrzeni nazw, klasie lub zakresie bloku. (Słowo static_assert
kluczowe jest technicznie deklaracją, mimo że nie wprowadza nowej nazwy do programu, ponieważ może być używane w zakresie przestrzeni nazw).
Opis zakresu static_assert
przestrzeni nazw
W poniższym przykładzie static_assert
deklaracja ma zakres przestrzeni nazw. Ponieważ kompilator zna rozmiar typu void *
, wyrażenie jest obliczane natychmiast.
Przykład: static_assert
z zakresem przestrzeni nazw
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Opis z zakresem static_assert
klasy
W poniższym przykładzie static_assert
deklaracja ma zakres klas. Funkcja static_assert
sprawdza, czy parametr szablonu jest zwykłym starym typem danych (POD). Kompilator sprawdza deklarację, gdy jest zadeklarowana, ale nie oblicza parametru static_assert
wyrażenia stałegodo momentu basic_string
utworzenia wystąpienia szablonu klasy w main()
pliku .
Przykład: static_assert
z zakresem klasy
#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;
}
Opis zakresu bloków static_assert
W poniższym przykładzie static_assert
deklaracja ma zakres blokowy. Sprawdza static_assert
, czy rozmiar struktury vmPage jest równy rozmiarowi strony pamięci wirtualnej systemu.
Przykład: static_assert
w zakresie bloku
#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.");
// ...
}
// ...
};
Zobacz też
Potwierdzanie i komunikaty dostarczone przez użytkownika (C++)
#error, dyrektywa (C/C++)
assert Macro, _assert, _wassert
Szablony
Zestaw znaków ASCII
Deklaracje i definicje
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla