簡體   English   中英

從范圍塊返回值賦予的C變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM