static_assert
Проверяет программное утверждение во время компиляции. Если указано константное выражение false
, компилятор отображает указанное сообщение, если он указан, и компиляция завершается ошибкой C2338; в противном случае объявление не действует.
static_assert( constant-expression, string-literal );
static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)
Константное выражение
Целочисленное константное выражение, которое можно преобразовать в логическое значение. Если вычисляемое выражение равно нулю (false), отображается параметр строкового литерала, а компиляция завершается ошибкой. Если выражение ненулевое (true), static_assert
объявление не действует.
Строковый литерал
Сообщение, отображаемое, если параметр констант-выражения равен нулю. Это сообщение представляет собой строку символов в базовом наборе символов компилятора. Это не многобайтовые или широкие символы.
Параметр static_assert
констант-выражения объявления представляет проверочное утверждение программного обеспечения. Программное утверждение определяет условие, которое должно выполняться на определенном этапе работы программы. Если условие имеет значение true, static_assert
объявление не действует. Если условие равно false, утверждение завершается ошибкой, компилятор отображает сообщение в параметре string-литералов , и компиляция завершается ошибкой. В Visual Studio 2017 и более поздних версиях параметр строкового литерала необязателен.
Объявление static_assert
проверяет утверждение программного обеспечения во время компиляции. В отличие от этого, макрос и _assert и функции _wassert проверяют утверждение программного обеспечения во время выполнения и влечет за собой затраты на время выполнения в пространстве или времени. static_assert
Объявление особенно полезно для отладки шаблонов, так как аргументы шаблона могут быть включены в параметр констант-выражения.
Компилятор проверяет static_assert
объявление синтаксической ошибки при обнаружении объявления. Компилятор немедленно вычисляет параметр констант-выражения , если он не зависит от параметра шаблона. В противном случае компилятор вычисляет параметр констант-выражения при создании экземпляра шаблона. Таким образом, компилятор может вывести одно диагностическое сообщение, когда встретит объявление, а второе — когда будет создавать экземпляр шаблона.
Ключевое static_assert
слово можно использовать в пространстве имен, классе или области блокировки. (Ключевое static_assert
слово технически является объявлением, несмотря на то, что оно не вводит новое имя в программу, так как оно может использоваться в области пространства имен.)
В следующем примере static_assert
объявление имеет область пространства имен. Поскольку компилятору известен размер типа void *
, выражение вычисляется немедленно.
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
В следующем примере static_assert
объявление имеет область класса. Проверяет static_assert
, является ли параметр шаблона обычным типом данных (POD). Компилятор проверяет объявление при объявлении, но не вычисляет static_assert
параметр констант-выражения , пока basic_string
не будет создан main()
экземпляр шаблона класса.
#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;
}
В следующем примере static_assert
объявление имеет область блокировки. Проверяет static_assert
, равен ли размер структуры VMPage страниц виртуальной памяти системе.
#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.");
// ...
}
// ...
};
Утверждение и сообщения об ошибках, предоставленные пользователем (C++)
Директива #error (C/C++)
Макрос assert, _assert, _wassert
Шаблоны
Набор символов ASCII
Объявления и определения