私の質問は、 GNUCの拡張機能として追加されたステートメント式に関するものです。次のコードについて考えてみます。
#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
container_of
この方法(拡張機能の使用)は、特にLinuxカーネルではかなり一般的です。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
この場合と同様に、ローカル変数を宣言してそれを使って何かを行うマクロを定義したいと思います。ただし、現在のスコープで使用可能な変数名を汚染せずにこれを実行し、再定義の可能性を回避したいと思います。再定義の場合にスコープがどのように正確に発生するかについてのドキュメント情報を見つけることができませんでした。
上記の場合、再定義に関してコンパイラから警告は発行されません。私の質問は、ステートメント式の内部でスコープされた変数が外部スコープの同じ名前の変数に影響を与えないという事実に頼ることができるかどうかです。