我的問題是關於statement expressions,其中加入作爲在GNU C.擴展考慮下面的代碼:在語句表達式中'重新定義'變量是否安全?
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i = 0;
printf("%d\n", i);
{int i = 1;printf("%d\n", i);}
printf("%d\n", i);
return EXIT_SUCCESS;
}
編譯(gcc -Wall -std=gnu99 lala.c -o lala
)和運行將產生:
0
1
0
這種做法(使用)是相當普遍的,特別是在Linux內核的container_of
中:
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr);
(type *)((char *)__mptr - offsetof(type,member));})
類似於這種情況,我想定義一個宏來聲明一個局部變量並用它做一些事情。但是,我想這樣做而不會污染當前範圍內可用的變量名稱,並避免可能的重新定義。我無法在文檔中找到有關重新定義情況下確定範圍的確切信息。
在上述情況下,編譯器不會發出有關重新定義的警告。我的問題是,我是否可以依賴這樣一個事實,即在語句表達式中的變量作用域不會影響外部作用域中相同名稱的變量?
什麼是不允許的聲明變量,其名稱以兩個影響變量下劃線。 – dreamlax 2012-04-27 12:50:09
是不是你的使用只是一個複合語句?因爲它是一個語句表達式,它必須根據鏈接的文檔括在括號中 – msam 2012-04-27 12:55:28
@msam:是的,但我想用括號定義一個宏 – 2012-04-27 12:58:20