2010-01-16 72 views
8

我注意到,有時,C宏被寫成這樣:有關`({});`在C中的更多信息?

#define foo(bar) ({ ++bar; }) 

一些實驗後,我發現:

  1. ({});會編,卻又無可奈何。 (如預期)
  2. 關閉;將導致語法錯誤。這樣做的副作用是確保foo()在代碼中看起來像一個函數。 (雖然,如果將分號關閉,那麼錯誤對於診斷問題並不是很有用!)
  3. return ({});抱怨不會被忽略的空值,就像我試圖使用void函數一樣。

這是爲了讓開發人員在他們的宏中添加一個分號,還是有另一個目的?我試過谷歌,但它標點符號失敗。有沒有這個名字?

回答

8

這是一個名爲statement expressions的GNU擴展。

在標準C中聲明宏時,經常會看到do...while(0)循環用於類似的目的(即創建塊範圍)。聲明表達式優於循環黑客,因爲它可以返回一個值。如果你想在標準C中做類似的事情,你必須定義一個額外的函數,並且失去詞法範圍的便利。

2

()是一個表達式。 ({code; code;})是一個表達式中的複合語句。這是一個GNU C擴展。

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

編輯:哇,我從谷歌該鏈接並沒有注意到它是GCC 2.95在第一。古!

+0

古代 - 但語法仍支持4.4.2。 – 2010-01-16 08:14:38

3

關於語句表達式(如果有一件很酷的事情)很酷的事情是最後一條語句是表達式的結果。

#define foo(bar) ({ ++bar; 3.1415927; }) 

int i = 0; 
float pi = foo(i); 
相關問題