2013-07-17 23 views
0

我在閱讀linux源代碼時發現了一些奇怪的語法。 的container_of宏看起來像c中的奇怪宏,使用多條語句

#define container_of(ptr, type, member) ({      \ 
     const typeof(((type *)0)->member) *__mptr = (ptr); \ 
     (type *)((char *)__mptr - offsetof(type,member));}) 

什麼困惑我是喜歡的語法({語句1;語句2;})

我試着像

int a = {1;2;}; 

我用gcc編譯它的一些簡單的代碼。運行後,'a'似乎是2.但它不能用Microsoft VC++編譯。這個語法是gcc的擴展功能嗎?如果是這樣,我怎樣才能獲得相同的效果沒有gcc擴展,如定義多個語句並通過使用宏返回一個值?

+0

**你爲什麼要問** Linux內核需要'gcc'(或者一個非常兼容的編譯器,比如* TinyCC *或LLVM/Clang *的最新版本)才能被編譯。 –

回答

2

({ ... })語法是GCC擴展名,稱爲statement expressions

typeof是另一個GCC擴展。

這兩個擴展都可用於其他編譯器,如LLVM/Clang(或TinyCC)。

Linux內核經常使用它們。

這很難避免它們。如果你真的想,你可能會考慮(這是一個不平凡的任務),從GIMPLE回到低級,不可移植和不可讀的C.你可能會使用MELT(部分工作是在J.Salvucci的文件melt/xtramelt-c-generator.melt)。

+0

謝謝。 Linux內核中有很多精通的代碼,對我來說很有價值。但有時候我不允許使用gcc,所以我想我應該嘗試一些其他方法來在其他編譯器中獲得類似的效果。 – Arthur

+0

我不知道誰使用'gcc'禁止你(以及爲什麼),但是你可以使用接受相同語言擴展名的'clang'。 –