程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++編程中綴言static_assert的運用

詳解C++編程中綴言static_assert的運用

編輯:關於C++

詳解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 
);

參數
參數 闡明 constant-expression 可以轉換為布爾值的整型常量表達式。假如計算出的表達式為零 (false),則顯示 string-literal 參數,並且編譯因出錯而失敗。假如表達式不為零 (true),則 static_assert 聲明有效。 string-literal 當 constant-expression 參數為零時顯示的音訊。該音訊是編譯器的根本字符集中的一個字符串;即,不是多字節或寬字符。
備注
static_assert 聲明的 constant-expression 參數表示軟件斷言。軟件斷言指定在順序的某個特定點應滿足的條件。假如滿足該條件,則 static_assert 聲明有效。假如未滿足該條件,則斷言失敗,編譯器在 string-literal 參數中顯示音訊,並且編譯因出錯而失敗。
static_assert 聲明在編譯時測試軟件斷言。相反,assert (CRT) 宏在運轉時測試軟件斷言,並會招致增大運轉時破費的空間和時間。由於模板參數包括在 constant-expression 參數中,因而 static_assert 聲明關於調試模板很有用。
當遇到聲明時,編譯器將反省 static_assert 聲明能否存在語法錯誤。假如編譯器不依賴於模板參數,則編譯器會立刻計算 constant-expression 參數。否則,在對模板停止實例化時,編譯器將計算 constant-expression 參數。因而,當遇到聲明時,編譯器能夠一次發布一個診斷音訊,而在對模板停止實例化時也是如此。
可以在命名空間、類或塊范圍中運用 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 聲明時反省該聲明,但不計算 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.");
 // ...
 }
// ...
};

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved