簡體   English   中英

C ++中的編譯時斷言?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM