我偶然发现了似乎没有效果的代码,但显然是因为它位于Mono codebase for already 2 years。以下是小节选。如何将宏“mono_atomic_load_acquire”的结果分配给unload_data_unref中的变量“count”(..)我假设__tmp是被分配的内容,但我找不到任何在C中使用范围界定的信息。任何人都可以解释或提供一些有用的链接吗?
#define mono_atomic_load_acquire(target) ({ \
typeof (*target) __tmp = *target; \
LOAD_ACQUIRE_FENCE; \
__tmp; })
#define LOAD_ACQUIRE_FENCE MEMORY_BARRIER
#define MEMORY_BARRIER mono_memory_barrier ()
static inline void mono_memory_barrier (void)
{
// platform specific code
}
unload_data_unref (unload_data *data)
{
gint32 count;
do {
count = mono_atomic_load_acquire (&data->refcount);
g_assert (count >= 1 && count <= 2);
if (count == 1) {
g_free (data);
return;
}
} while (InterlockedCompareExchange (&data->refcount, count, count - 1) != count);
}
答案 0 :(得分:5)
这是一个GNU扩展,它们被称为语句表达式(不要与标准的C语言结构混淆,称为“表达式语句”)。事实上,它被分配了__tmp
。 Docs here.
答案 1 :(得分:0)
所以这是statement expression
。这是一个gcc extension
,根据文档6.1 Statements and Declarations in Expressions:
复合语句中的最后一件事应该是一个后跟分号的表达式;此子表达式的值用作整个构造的值。
在这种情况下,它将是__tmp
。根据文件:
此功能在使宏定义“安全”时非常有用(因此它们只能评估每个操作数一次)。
它在不使用statement expressions
的情况下提供了此示例:
#define max(a,b) ((a) > (b) ? (a) : (b))
与此safe
版本对比,但需要注意操作数的类型:
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })