程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> gcc對C語言的擴展:語句內嵌表達式(statement-embedded expression)

gcc對C語言的擴展:語句內嵌表達式(statement-embedded expression)

編輯:關於C語言

在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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved