2014-09-22 80 views
-2

在堆棧溢出我遇到了一個問題What is ":-!!" in C code?宏在linux kernel.h當文件中定義

> #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) 
> #define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); })) 

出於好奇,我想知道我該如何使用這些類型的宏?

int main() 
{ 
    BUILD_BUG_ON_ZERO(0); 
    return 0; 
} 

在上面的代碼中,它給出了一個錯誤,類型名稱是不允許的。

編輯: 代碼編譯使用gcc的Linux,但無法在Visual Studio中

+0

我認爲這就是這些宏的目的:在ZERO或NULL上給出編譯錯誤。 – 2014-09-22 11:18:46

+0

http://stackoverflow.com/questions/9229601/what-is-in-c-code [編輯:]那裏還沒有回答什麼? – mafso 2014-09-22 11:18:57

+0

我想知道如何在代碼中使用它.. – theadnangondal 2014-09-22 11:20:46

回答

4

閱讀best answer小心:

宏有些名不副實;它應該是更喜歡 BUILD_BUG_OR_ZERO,而不是...ON_ZERO

所以它不能在編譯的時候參數爲非零:

int main() 
{ 
    BUILD_BUG_ON_ZERO(1); 
    return 0; 
} 

http://ideone.com/TI97r3


至於實際的用法:

int main() 
{ 
    BUILD_BUG_ON_ZERO(sizeof(int) != 4); // we need int to be 4 bytes, stop compilation otherwise 
    return 0; 
} 

至於C++:這是一個C構造,根本不用C++編譯。

在C++ 11中,您可以改爲使用static_assert

+2

當然,在C++中,您可以重新定義宏以適合'static_assert'。 – Angew 2014-09-22 11:38:24

+1

我認爲_UNLESS_ZERO會比_OR_ZERO – 2014-09-22 11:49:39

+1

更好,只是記錄static_assert在C++ 11和C11之間是很常見的。 – 2014-09-22 15:23:40