Linuxカーネルでマクロの定義を調べたところ、container_of
複合ステートメントがマクロ定義であることがわかりました。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
しかし、私の頭の中の不明確な問題は、どのステートメントが右辺値として考慮されるかということです。どうやら最後のステートメントの結果が右辺値として使用されていますが、なぜですか?
(type *)( (char *)__mptr - offsetof(type,member) );
たとえば、以下のコード例はCで合法ですか?
int g_count = 0xFF;
#define GLOBAL_COUNT do {g_count;} while(0)
int main(int argc, char *argv[])
{
int local;
local = GLOBAL_COUNT;
local = 0;
GLOBAL_COUNT = local;
return 0;
}
複合ステートメントの変数の割り当てルールは何ですか?