我們現有的編譯時聲明實現基於負數組索引,並且它在GCC上提供較差的診斷輸出。 C++ 0x的static_assert
是一個非常好的功能,它提供的診斷輸出要好得多。我知道GCC已經實現了一些C++ 0x功能。有誰知道static_assert
是否在其中,如果是GCC版本以後的話?GCC是否有內置的編譯時間斷言?
16
A
回答
29
8
下面的代碼工作正常使用g ++ 4.4.0當與-std=c++0x
標誌編譯:
int main() {
static_assert(false, "that was false");
}
它顯示:
x.cpp: In function 'int main()':
x.cpp:2: error: static assertion failed: "that was false"
16
如果您需要使用gcc版本,其不支持它你可以使用
#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(/* assertion */)
基本上,什麼提升是這樣的:
申報(但不定義!)一個
template< bool Condition > struct STATIC_ASSERTION_FAILURE;
定義爲斷言成立的情況下專業化:
template <> struct STATIC_ASSERTION_FAILURE<true> {};
然後你就可以這樣定義STATIC_ASSERT:
#define STATIC_ASSERT(Condition) \
enum { dummy = sizeof(STATIC_ASSERTION_FAILURE< (bool)(Condition) > }
訣竅是,如果條件爲假,編譯器需要實例化struct
STATIC_ASSERTION_FAILURE<false>
爲了計算它的大小,並且由於它沒有被定義而失敗。
1
這並沒有真正回答這個問題,但我更喜歡基於switch-case的編譯時斷言,例如,
#define COMPILE_TIME_ASSERT(cond) do { switch(0) { case 0: case cond: ; } } while (0)
也適用於C而不僅僅是C++。 http://www.pixelbeat.org/programming/gcc/static_assert.html
5
如果你有一箇舊的gcc或使用舊的C++標準,或使用C,那麼你可以在此描述效仿static_assert -專業化。就我所知,這是如何提升 。這是我用作static_assert的東西,它非常簡單。
namespace Internal
{
template<bool x> struct SASSERT_F;
template< > struct SASSERT_F <true> {};
template<int x> struct SASSERT_P {};
#define STATIC_ASSERT(B) \
typedef Internal::SASSERT_P <(\
sizeof (Internal::SASSERT_F <(\
((B)? true : false)) >) \
)> \
StaticAssert##__LINE__ ()
}
使用示例
int main(int argc, char **argv)
{
static_assert(sizeof(int) == 1) // Error
static_assert(sizeof(int) == sizeof(int)) // OK
}
1
你可以隨時玩弄通過模板模板和不存在的 strutures:
1
NSPR作用:
#define PR_STATIC_ASSERT(condition) \
extern void pr_static_assert(int arg[(condition) ? 1 : -1])
從而未能如果condition
是假的,因爲它聲明負長度的數組。
0
兩個
BOOST_STATIC_ASSERT(x)
BOOST_STATIC_ASSERT_MSG(x, msg)
,如果你的編譯器支持它
相關問題
- 1. 是否有可能在C++中使用編譯時斷言
- 2. 在Swift中編譯時間斷言?
- 3. GCC中是否有編譯選項在編譯時檢查內存錯誤?
- 4. 在assert someBoolean();之間禁用斷言的編譯Java是否有區別?和verifySomeBoolean();後者包含斷言?
- 5. 無斷言編譯
- 6. 是否有任何編譯時檢查C++中斷言的工具?
- 7. Windows GCC和MSVC編譯器之間的編譯時間比較
- 8. GHC Haskell的編譯時斷言?
- 9. 與CLANG編譯時,是否有相當於GCC的GCC進行調試?
- 10. ARM GCC是否具有彙編'REV'指令的內置函數?
- 11. gcc編譯器配置:否C++!
- 12. 編譯時有/無斷言時的javap差異
- 13. gcc是否可以不編譯代碼?
- 14. 編寫gcc gnatmake Ada編譯器的語言是什麼?
- 15. 編譯時間明顯較慢GCC
- 16. gcc明白編譯時間在哪裏
- 17. 如何計算gcc編譯時間?
- 18. gcc內存中編譯
- 19. 用Cygwin GCC編譯的C++程序是否有免費的內存調試器?
- 20. 是否有Golang終端外殼?編譯語言是否可能?
- 21. LLVM 5.0編譯器是否等同於GCC編譯器?
- 22. 如何在沒有C++的情況下編譯時間斷言11
- 23. 慢編譯時間與升壓+ GCC +編譯頭
- 24. 編譯器內是否有預編譯IPV6的標誌
- 25. 是否可以配置GCC爲android編譯?
- 26. 是否有內聯網頁編譯器?
- 27. 當使用Microsoft的Visual C++編譯器時,是否有與gcc等價的pedantic?
- 28. 有沒有辦法編譯gcc來支持單一語言?
- 29. 是否有編譯iPad時設置的特定Xcode編譯器標誌?
- 30. 編譯riscv-gcc時出錯
http://en.wikichip.org/wiki/c/static_assertions – 2015-06-02 23:21:11