[英]Compile-time assertions in C++?
我最近發現需要在C ++中使用編譯時斷言來檢查兩種類型的大小是否相等。
我在網上發現了以下宏(聲稱來自Linux內核):
#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
我喜歡這樣:
X_ASSERT(sizeof(Botan::byte) != sizeof(char));
這讓我好奇-雖然這工作的 ,是有一個更清潔的方式來做到這一點? (顯然,不止一種方式)某些方法有優缺點嗎?
在C ++ 0x中,有一個新的語言特性static_assert
,它提供了生成編譯時斷言的標准方法。 例如,
static_assert(sizeof(Botan::byte) != 1, "byte type has wrong size");
Visual C ++ 2010支持static_assert
,g ++ 4.3(及更高版本)和Intel C ++ 11.0也是如此。
您可能想看看Boost StaticAssert 。 內部不完全干凈(或者不是我最后一次看)但至少它更容易被識別,因此大多數人都知道這意味着什么。 如果內存服務,它也會產生更有意義的錯誤消息。
其他一些有趣的選項在這里: http : //www.jaggersoft.com/pubs/CVu11_3.html
作者在閱讀C(非C ++)規范時尋找可以用作編譯時斷言的語法。
要做到正確,你需要一個C ++ 0x友好編譯器,請參閱James McNellis和Jerry Coffins的答案。
你不能對1998或2003 C ++標准做很多事情。 看一下這些鏈接的例子:
http://en.wikipedia.org/wiki/Assertion_(computing)#Static_assertions http://ksvanhorn.com/Articles/ctassert.html
有一個很好的#error
預處理程序指令(請參閱這里有一篇關於它的好文章),但我認為它需要在#if
,而不是像在你的示例中那樣用於“獨立”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.