Udostępnij za pośrednictwem


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++)

#error — dyrektywa (C/C++)

assert (CRT)

Zestaw znaków ASCII

Deklaracje

Inne zasoby

Szablony