日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression)

發布時間:2023/11/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在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。

轉載于:https://blog.51cto.com/nathanxu/6027

總結

以上是生活随笔為你收集整理的gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。