詳解C++編程中止言static_assert的應用。本站提示廣大學習愛好者:(詳解C++編程中止言static_assert的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中止言static_assert的應用正文
斷言和用戶供給的新聞
C++ 說話支撐可贊助您調試運用法式的三個毛病處置機制:#error 指令、static_assert 症結字和 assert (CRT) 宏。一切的三種機制都邑收回毛病新聞,個中兩個還會測試軟件斷言。軟件斷言指定在法式的某個特定點應知足的前提。假如編譯時斷言掉敗,編譯器將收回診斷新聞和編譯毛病。假如運轉時斷言掉敗,操作體系將收回診斷新聞並封閉運用法式。
備注
運用法式的生計期由預處置、編譯和運轉時階段構成。每一個毛病處置機制都邑拜訪在這三個階段之一中可用的調試信息。若要有用地調試,請選擇供給有關該階段的響應信息的機制:
#error 指令在預處置時有用。它將無前提地收回用戶指定的新聞並招致編譯因毛病而掉敗。該新聞可包括由預處置器指令操作的文本,但不管帳算任何生成的表達式。
static_assert 聲明在編譯時有用。它將測試由用戶指定且可以轉換為布爾值的整數表達式表現的軟件斷言。假如表達式的盤算成果為零 (false),編譯器將收回用戶指定的新聞,而且編譯因毛病而掉敗。
static_assert 聲明對換試模板特別有效,由於模板參數可包括在用戶指定的表達式中。
assert (CRT) 宏在運轉時有用。它管帳算用戶指定的表達式,假如成果為零,體系將收回診斷新聞並封閉運用法式。許多其他宏(如_ASSERT 和 _ASSERTE)與此宏相似,但它們收回分歧的體系界說或用戶界說的診斷新聞。
static_assert
在編譯時測試軟件斷言。假如指定的常量表達式為 false,則編譯器顯示指定的新聞,而且編譯掉敗,毛病為 C2338;不然,聲明不起感化。
語法
static_assert( constant-expression, string-literal );
參數
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
解釋
鄙人面的示例中,static_assert 聲明具有類規模。 static_assert 驗證模板參數能否為純舊數據 (POD) 類型。編譯器將在聲明 static_assert 聲明時檢討該聲明,但不盤算 constant-expression 參數,直到在 main() 中實例化 basic_string 類模板。
示例
#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; }
解釋
鄙人面的示例中,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."); // ... } // ... };