Когда я исследовал определение макроса container_of
в ядре Linux, я увидел составной оператор как определение макроса,
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
однако неясный вопрос, на мой взгляд, заключается в том, какое утверждение принимается во внимание как rvalue. По-видимому, результат последнего утверждения используется как rvalue, но почему?
(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;
}
Каково правило присваивания переменных в составных операторах?