日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++中#error/assert/static_assert的区别及使用

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中#error/assert/static_assert的区别及使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++ 語言支持可幫助您調試應用程序的三個錯誤處理機制:#error 指令、static_assert 關鍵字和 assert (CRT) 宏。所有的三種機制都會發出錯誤消息。

#error可看做預編譯期斷言,甚至都算不上斷言,僅僅能在預編譯時顯示一個錯誤信息,它能做的不多,可以參與預編譯的條件檢查,由于它無法獲得編譯信息,當然就做不了更進一步分析了。使用#error方法是非常煩瑣的,并且不能夠對模板參數進行檢查,因為模板實例化是在編譯時進行,而#error方法是在預處理階段進行的。

#error 指令在預處理時有效。它將無條件地發出用戶指定的消息并導致編譯因錯誤而失敗。該消息可包含由預處理器指令操作的文本,但不會計算任何生成的表達式。

assert是運行期斷言,它用來發現運行期間的錯誤,不能提前到編譯期發現錯誤,也不具有強制性,也談不上改善編譯信息的可讀性,既然是運行期檢查,對性能當然是有影響的,所以經常在發行版本中,assert都會被關掉。

assert (CRT) 宏在運行時有效。它會計算用戶指定的表達式,如果結果為零,系統將發出診斷消息并關閉應用程序。

static_assert語法:static_assert(constant-expression,string-literal);

static assert is used to make assertions at compile time. When the static assertion fails, the program simply doesn't compile.

static_assert這個宏用于檢測和診斷編譯時錯誤。編譯期,這是一個與 CRT-assert(運行時宏)相反的宏。這個宏用于檢測編譯時程序的不變量。static_asset 是在編譯時執行的,不能用于檢測運行時的值。而斷言assert宏只有在程序運行時才能起作用。

static_assert宏,在編譯時測試軟件斷言。如果指定的常量表達式為false,則編譯器顯示指定的消息,并且編譯失敗,錯誤為 C2338;否則,聲明不起作用。

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,我們可以在編譯期間發現更多的錯誤,用編譯器來強制保證一些契約,并幫助我們改善編譯信息的可讀性,尤其是用于模板的時候。static_assert可以用在全局作用域中,命名空間中,類作用域中,函數作用域中,幾乎可以不受限制的使用。編譯器在遇到一個static_assert語句時,通常立刻將其第一個參數作為常量表達式進行演算,但如果該常量表達式依賴于某些模板參數,則延遲到模板實例化時再進行演算,這就讓檢查模板參數成為了可能。

由于static_assert是編譯期間斷言,不生成目標代碼,因此static_assert不會造成任何運行期性能損失。

static_assert聲明在編譯時有效。它將測試由用戶指定且可以轉換為布爾值的整數表達式表示的軟件斷言。如果表達式的計算結果為零 (false),編譯器將發出用戶指定的消息,并且編譯因錯誤而失敗。static_assert 聲明對調試模板尤其有用,因為模板參數可包含在用戶指定的表達式中。

以下是測試代碼:

static_assert.hpp:

#ifndef FBC_MESSY_TEST_STATIC_ASSERT_HPP
#define FBC_MESSY_TEST_STATIC_ASSERT_HPP#ifndef __cplusplus#error static_assert.hpp header must be compiled as C++
#endif#include <type_traits>
#include <iosfwd>
#include <cassert>// reference: https://msdn.microsoft.com/zh-cn/library/dd293588.aspx// static_assert 聲明具有類范圍。 static_assert 驗證模板參數是否為純舊數據 (POD) 類型。
// 編譯器將在聲明 static_assert 聲明時檢查該聲明,但不計算 constant-expression 參數,直到在 main() 中實例化 basic_string 類模板
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {static_assert(std::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() {}
};// reference: http://stackoverflow.com/questions/1647895/what-does-static-assert-do-and-what-would-you-use-it-for
class Foo
{
public:static const int bar = 5; // 3
};static_assert(Foo::bar > 4, "Foo::bar is too small :(");void test_static_assert1();
void test_static_assert2();
void test_static_assert3();
void test_static_assert4(int a);#endif // FBC_MESSY_TEST_STATIC_ASSERT_HPP
static_assert.cpp:

#include "static_assert.hpp"void test_static_assert1()
{// static_assert 聲明具有命名空間范圍。由于編譯器知道類型 void * 的大小,因此可以立即計算表達式//該static_assert用來確保編譯僅在32位的平臺上進行,不支持64位的平臺//static_assert(sizeof(void *) == 4, "64-bit code generation is not supported."); // sizeof(void *) = 8 ?
}void test_static_assert2()
{basic_string<char> bs;
}void test_static_assert3()
{Foo::bar;
}void test_static_assert4(int a)
{assert(a / 2 == 0);
}

主要參考文獻:

1.?https://msdn.microsoft.com/zh-cn/library/dd293588.aspx


GitHub:https://github.com/fengbingchun/Messy_Test

總結

以上是生活随笔為你收集整理的C++中#error/assert/static_assert的区别及使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:C++中#error/assert/static_asser