Sdílet prostřednictvím


static_assert

Testuje výraz softwaru v době kompilace.Pokud zadaný výraz konstanty je false, kompilátor zobrazí zadanou zprávu a kompilace se nezdaří s chybou C2338; jinak deklarace nemá žádný vliv.

static_assert( 
    constant-expression, 
    string-literal 
);

Parametry

Parametr

Description

constant-expression

Integrální konstantní výraz, který lze převést na logickou hodnotu.

Pokud vyhodnocený výraz je nula (nepravda), parametr string-literal se zobrazí a kompilace se nezdaří s chybou.Pokud je podmínka nenulová (pravda), prohlášení static_assert nemá žádný vliv.

string-literal

Zpráva, která se zobrazí, pokud je parametr constant-expression nula.Zpráva je řetězec znaků v základní znakové sadě kompilátoru. To znamená, že se nejedná o vícebajtové široké znaky.

Poznámky

Parametr constant-expression prohlášení static_assert představuje softwarové tvrzení.Softwarové tvrzení určuje podmínku, u které očekáváte, že bude true, v určitém místě v aplikaci.Pokud je podmínka pravdivá, prohlášení static_assert nemá žádný vliv.Pokud je podmínka nepravda, výraz se nezdaří, kompilátor zobrazí zprávu v parametru string-literal a kompilace selže s chybou.

Deklarace static_assert testuje kontrolní výraz softwaru v době kompilace.Oproti tomu makro assert (CRT) testuje výraz softwaru za běhu a běh je nákladný na prostor nebo čas.Prohlášení static_assert je zvláště užitečné pro šablony ladění, protože argumenty šablony mohou být součástí parametru constant-expression.

Kompilátor ověří prohlášení static_assert o syntaktických chybách při výskytu prohlášení.Kompilátor vyhodnotí parametr constant-expression okamžitě, pokud není závislý na parametru šablony.V opačném případě kompilátor vyhodnocuje parametr constant-expression při vytváření instance šablony.V důsledku toho kompilátor může zahlásit diagnostickou zprávu jednou při zjištění prohlášení a znovu když je vytvořena šablona instance.

Klíčové slovo static_assert můžete použít v oboru názvů, třídě nebo rozsahu bloku. (Klíčové slovo static_assert je technicky prohlášení, i když nezavádí nové jméno do programu, protože může může být použito v oboru názvů.)

Description

V následujícím příkladu má prohlášení static_assert rozsah oboru názvů.Vzhledem k tomu, že kompilátor zná velikost typu void *, je výraz vyhodnocen ihned.

Příklad

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

Description

V následujícím příkladu má prohlášení static_assert rozsah třídy.static_assert ověřuje, zda je parametr šablony typu obyčejná stará data (POD).Kompilátor zkontroluje prohlášení static_assert při jeho deklaraci, ale nevyhodnotí parametr constant-expression, dokud není pro šablonu třídy basic_string vytvořena instance v main().

Příklad

#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;
}

Description

V následujícím příkladu má prohlášení static_assert rozsah bloku.static_assert ověří, zda je velikost struktury VMPage rovna velikosti stránky virtuální paměti systému.

Příklad

#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.");
    // ...
    }
// ...
};

Viz také

Referenční dokumentace

Kontrolní výraz a uživatelem zadané zprávy (C++)

#error – direktiva (C++)

assert (CRT)

Znaková sada ASCII

Deklarace

Další zdroje

Šablony