gcc對C語言的擴充:語句內嵌運算式(statement-embedded expression)

來源:互聯網
上載者:User

在gnu c 中,用括弧將複合陳述式括起來也形成了運算式。他允許你在一個運算式內使用迴圈,跳轉和局部變數。

一個複合陳述式是用大括弧{}括起來的一組語句。在包含語句的運算式這種結構中,再用括弧( )將大括弧括起來,例如:

({ int y = foo (); int z;

if (y > 0) z = y;

else z = - y;

z; })

就是一個合法運算式,用於計算foo( )函數傳回值的絕對值。

在上面的複合陳述式中,最後的一句必須是一個以分號結尾的運算式。這個運算式代表了整個結構的值。如果你在大括弧裡的最後一句用的是其他的語句,則整個結構的傳回型別為void,即沒有合法的傳回值。

這種特性使得宏定義變得更加安全(因為每個運算元都只被計算一次,例如++運算)。例如計算最大值通常在c語言中被定義為這樣的宏:

#define max(a,b) ((a) > (b) ? (a) : (b))

但是其中的a和b可能會被計算兩次,如果運算元帶有副作用,則會產生錯誤的結果。在gnu c中,如果你知道了運算元的類型(假設為int),你可以這樣安全的定義宏:

#define maxint(a,b) \

({int _a = (a), _b = (b); _a > _b ? _a : _b; })

語句內嵌在常量運算式(例如枚舉類型),位域尺寸或靜態變數初始化中是不允許的。如果你不知道運算元的類型,你也可以使用typeof來獲得類型。

語句運算式內嵌在g++中並不支援,而且將來是否支援目前也不清楚(他們在某時被完全支援或者被拋棄掉,或者作為bug會一直存在)。就目前而言,語句內嵌運算式在預設情況下工作的並不好。

此外,在c++中語句內嵌運算式還存在很多語義問題。如果你希望在c++中用語句內嵌運算式來代替內嵌函式(inline function),對象的析構處理可能會讓你驚訝。例如:

#define foo(a) ({int b = (a); b + 3; })

並不等同於

inline int foo(int a) { int b = a; return b + 3; }

具體而言,當傳遞給foo的運算式的會引入臨時對象的產生的時候,這些臨時對象的析構在用宏時會早於用函數的情況。

以上情況說明在用於c++代碼的.h標頭檔中使用語句內聯運算式並不是一個好主意。一些gnu c的庫的某些版本中的使用語句內聯運算式的標頭檔已經造成了這樣的bug。

文章來源: http://nathanxu.blog.51cto.com/50836/6027

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。