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