[英]C variable assigned with return value from scope block?
我偶然發現了看似不合適的代碼,但顯然是因為它已經在Mono代碼庫中已經存在了2年 。 以下是小節選。 如何將宏“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);
}
這是一個GNU擴展,它們被稱為語句表達式(不要與標准的C語言結構混淆,稱為“表達式語句”)。 事實上,它被分配了__tmp
。 文檔在這里。
所以這是一個statement expression
。 它是一個gcc extension
,根據文檔6.1表達式中的語句和聲明 :
復合語句中的最后一件事應該是一個后跟分號的表達式; 此子表達式的值用作整個構造的值。
在這種情況下,它將是__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; })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.