程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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