簡體   English   中英

復合文字和清理

[英]Compound literal and cleanup

我正在使用cleanup 變量屬性以使用此宏釋放互斥鎖:

#define LOCK()                                                          \
    pthread_mutex_lock(&mutex);                                         \
    int32_t tmpv_ __attribute__((cleanup(mutexUnlock))) = 0;            \
    (void)tmpv_

mutexUnlock是一個自定義函數,它只是釋放mutex

void mutexUnlock(int32_t* dummy)
{
    (void)dummy;
    pthread_mutex_unlock(&mutex);
}

在了解了復合文字后,我想擺脫tmpv_變量,因為在這種情況下不需要它:

#define LOCK()                                                          \
    pthread_mutex_lock(&mutex);                                         \
    (void)(int32_t __attribute__((cleanup(mutexUnlock)))){0}

但是編譯器在每個使用宏的地方都會給我一個警告:

warning: 'cleanup' attribute does not apply to types [-Wattributes]

我不知道如何解釋這一點。 此外,宏不能按預期工作(不調用mutexUnlock )。 這段代碼有什么問題?

我正在使用清理變量屬性以使用此宏釋放互斥鎖 [...]

我不能說我非常看重這個想法。 它使您的代碼對任何閱讀它的人(甚至可能是未來的您)來說都是神秘的,並且如果代理變量以與您預期不同的方式超出范圍,它可能會產生未定義的行為,因此互斥鎖可能已經(或仍然)未鎖定或什至未初始化。

更不用說使用語言擴展,尤其是像 GCC 屬性這樣的特殊擴展,將您與特定的 C 實現緊密聯系在一起。 或許你不在乎這個,但如果是我,我至少想要得到一些很有價值的東西作為回報,我在這里看不到。

在了解了復合文字之后,我想擺脫tmpv_變量,因為在這種情況下不需要它。

但它需要的,或者至少需要一些東西來掛上屬性。 我猜您正試圖將屬性掛在復合文字上,但 GCC 沒有記錄對此的任何支持:

關鍵字__attribute__允許您指定變量、函數參數或結構、聯合以及在 C++ 中的類成員的特殊屬性。 [...] 其他屬性可用於函數(請參閱函數屬性)、標簽(請參閱標簽屬性)、枚舉數(請參閱枚舉數屬性)、語句(請參閱語句屬性)和類型(請參閱類型屬性)。

GCC 在線文檔

復合文字不是記錄在案的任何支持 GCC 屬性的項目。

你繼續,

 #define LOCK() \\ pthread_mutex_lock(&mutex); \\ (void)(int32_t __attribute__((cleanup(mutexUnlock)))){0}

但是編譯器在每個使用宏的地方都會給我一個警告:

 warning: 'cleanup' attribute does not apply to types [-Wattributes]

我不知道如何解釋這一點。

可以想象,該屬性可以附加到該代碼中的唯一句法構造是類型名稱int32_t 正如 GCC 警告您的那樣, cleanup屬性不適用於類型(盡管還有其他屬性適用於類型)。 結果是該屬性的使用沒有效果,正如您所觀察到的(避免嘗試變得可愛/神奇的另一個原因)。 GCC 選擇就這個問題向您發出警告,而不是完全編譯失敗或靜默忽略該屬性。

這段代碼有什么問題?

如果您可以將屬性附加到復合文字,我希望 GCC 要求它們在文字之前或之后,而不是出現在其中。 但同樣,據我所知,GCC 不支持復合文字的屬性。

更一般地說,使用__cleanup__屬性的唯一遠程合理的方法是將它附加到要清理的對象上——在這種情況下是mutex 將它附加到代理對象以使用該對象的范圍來觸發涉及不同對象的隨機行為是對該功能的可悲濫用。 我建議放棄整個想法,而是明確地解鎖互斥鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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