ANSI C中的parens表達式包含復合語句(塊)嗎?瀏覽Linux內核源代碼時,我發現了一段代碼,其中括號括起來的語句塊被視為表達式la lisp(或ML),即表達式,其值是最后一個語句的值。例如:int a = ({
int i;
int t = 1;
for (i = 2; i<5; i++) {
t*=i;
}
t;});我一直在研究ANSI C語法,試圖弄清楚這段代碼如何適合解析樹,但我還沒有成功。那么,有沒有人知道這種行為是由標準規定還是只是GCC的特殊性?更新:我已嘗試使用標志-pedantic,編譯器現在給我一個警告:warning: ISO C forbids braced-groups within expressions
2 回答

白衣染霜花
TA貢獻1796條經驗 獲得超10個贊
這是無效的C它是一個gcc
名為語句表達式的擴展,你可以在這里找到完整的C擴展列表。這實際上是Linux內核中使用的許多gcc擴展之一,似乎clang也支持這一點,盡管它沒有在文檔中明確命名。
當你觀察到最后一個表達式作為表達式的值時,文檔說(強調我的):
復合語句中的最后一件事應該是一個后跟分號的表達式; 此子表達式的值用作整個構造的值。(如果你在大括號中最后使用了一些其他類型的語句,那么構造的類型為void,因此實際上沒有值。)
其中一個主要好處是制作安全的宏,避免多重評估帶有副作用的參數。給出的示例使用此不安全的宏:
#define max(a,b) ((a) > (b) ? (a) : (b))
可以使用語句表達式重寫其中一個a
或b
兩個并重寫以消除此問題,如下所示:
#define maxint(a,b) \ ({int _a = (a), _b = (b); _a > _b ? _a : _b; })
注意,需要明確使用int
哪個可以修復使用另一個gcc
擴展名Typeof:
#define max(a,b) \ ({ typeof (a) _a = (a), _b = (b); _a > _b ? _a : _b; })
請注意,clang也支持typeof。
- 2 回答
- 0 關注
- 514 瀏覽
添加回答
舉報
0/150
提交
取消