static_assert
Testuje asercję oprogramowania w czasie kompilacji.Jeśli podane wyrażenie stałe ma wartość false, kompilator wyświetla określony komunikat i kompilacja nie powiedzie się ze zgłoszeniem błędu C2338; w przeciwnym razie deklaracja nie ma wpływu.
static_assert(
constant-expression,
string-literal
);
Parametry
Parametr |
Opis |
---|---|
constant-expression |
Wyrażenie stałe liczby całkowitej można przekonwertować na wartość logiczną. Jeśli obliczane wyrażenie jest równe zeru (fałsz), parametr string-literal jest wyświetlany, a kompilacja kończy się niepowodzeniem ze zgłoszeniem błędu.Jeśli wyrażenie jest niezerowe (prawda), deklaracja static_assert nie ma wpływu. |
string-literal |
Komunikat, który jest wyświetlany, gdy parametr constant-expression jest równy zero.Wiadomość to ciąg znaków w podstawowy zestaw znaków kompilatora; oznacza to, że nie są to znaki wielobajtowe ani szerokie. |
Uwagi
Parametr constant-expression deklaracji static_assert reprezentuje asercję oprogramowania.Potwierdzenie oprogramowania określa warunek, którego spełnienia można oczekiwać w określonym punkcie programu.Jeśli warunek jest spełniony, deklaracja static_assert nie ma wpływu.Jeśli warunek nie jest spełniony, potwierdzenie nie powiedzie się, kompilator wyświetla komunikat w parametrze string-literal, a kompilacja kończy się niepowodzeniem ze zgłoszeniem błędu.
Deklaracja static_assert testuje asercję oprogramowania w czasie kompilacji.Natomiast makro assert (CRT) testuje asercję oprogramowania w czasie wykonywania i ponosi koszty wykonywania w przestrzeni lub w czasie.Deklaracja static_assert jest szczególnie przydatna podczas debugowania szablonów, ponieważ argumenty szablonu mogą być zawarte w parametrze constant-expression.
Kompilator sprawdza deklarację static_assert dla błędów składniowych po napotkaniu deklaracji.Kompilator ocenia parametr constant-expression natychmiast, jeśli nie zależy od parametru szablonu.W przeciwnym wypadku kompilator oblicza parametr constant-expression przy tworzeniu wystąpienia szablonu.W związku z tym kompilator może wydać komunikat diagnostyczny raz, kiedy napotka deklarację i ponownie, przy wystąpieniu szablonu.
Możesz użyć słowa kluczowego static_assert w przestrzeni nazw, klasie lub zakresie bloku. (Słowo kluczowe static_assert jest technicznie deklaracją, mimo że nie wprowadza nowej nazwy do tego programu, ponieważ może być stosowane w zakresie przestrzeni nazw).
Opis
W poniższym przykładzie deklaracja static_assert ma zakres przestrzeni nazw.Ponieważ kompilator zna wybrany rozmiar czcionki void *, wyrażenie jest oceniane natychmiast.
Przykład
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Opis
W poniższym przykładzie deklaracja static_assert ma zakres klasy.static_assert sprawdza, czy parametr szablonu ma typ zwykłe stare dane (POD).Kompilator sprawdza deklarację static_assert w momencie jej deklarowania, ale nie ocenia parametru constant-expression aż do chwili, gdy szablon klasy basic_string zostanie utworzony w main().
Przykład
#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;
}
Opis
W poniższym przykładzie deklaracja static_assert ma zakres bloku.static_assert sprawdza, czy rozmiar struktury VMPage jest równy rozmiarowi strony pamięci wirtualnej systemu.
Przykład
#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ż
Informacje
Potwierdzanie i komunikaty dostarczone przez użytkownika (C++)