2015-09-25 81 views
2

我正在學習gcc的cleanup attribute,並學習如何調用函數以在變量超出範圍時運行,我不明白你爲什麼可以使用「cleanup」這個詞有或沒有下劃線。 下劃線的文檔或文檔在哪裏?gcc預編譯器指令__attribute__((__cleanup__))vs((cleanup))(with vs without underscores?)

上述GCC的文檔顯示它是這樣的:

__attribute__ ((cleanup(cleanup_function))) 

然而,大多數代碼示例我讀,顯示它是這樣的:

__attribute__ ((__cleanup__(cleanup_function))) 

例:

請注意,第一個示例鏈接狀態它們是相同的,當然編碼它證明了這一點,但他是如何知道這最初?這個是從哪裏來的?

爲什麼區別? __cleanup__在哪裏定義或記錄,而不是cleanup

我的根本問題在於,我不知道是什麼我不知道的事實,因此我想揭露一些我未知的未知的,使他們成爲已知的未知,直到我可以學習他們,使他們知道知道。

我的想法是,也許有一些全球適用的原則gcc預處理器指令,您可以在任何一個之前或之後任意添加下劃線? - 或者也許只有其中一些? - 或者它可能以某種方式修改預處理器指令或屬性,並且有些情況下一個方法(有或沒有額外的下劃線)比另一個方法更受歡迎?

+1

您提供的第一個鏈接提示(如果不是徹底的狀態)「清理」和「__cleanup__」是相同的。此外,鑑於您已將此標籤標記爲C++,我還要提到它的最佳目的是在C樣式代碼中使用RAII語義。一般來說,在C++中,你應該把需要清理的東西包裝到一個具有析構函數的類中(並且通過C++ 11或更新版本的三條規則或五條規則 - 你也需要構造函數和/或移動操作員)。 – inetknght

+1

謝謝。我多說了一下我的問題。第一個鏈接確實說明它們是相同的,但是我想知道這對於我使用的其他屬性意味着什麼....是否始終存在同一事物的多個選項?這個人怎麼知道他們是一樣的?當然,必須存在一些差異的原因。查看我更新的答案,瞭解我的一些驚喜。 –

回答

3

由於https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax解釋說:

您可以選擇指定與__之前和之後的名稱屬性名。這使您可以在頭文件中使用它們,而不用擔心同名的可能宏。例如,您可以使用屬性名稱__noreturn__而不是noreturn

(但請注意,屬性是不是預處理指令。)

+0

謝謝。那麼,如果不是預處理器指令,那麼屬性是什麼?預處理器指令是如何定義的?另外,有沒有術語「編譯器指令」?這有什麼不同? –

+1

預處理器指令是'#include','#define','#ifdef'等等。 – melpomene

+0

那你叫什麼__attribute__'呢?如果不是「指令」,這種類型的東西有什麼好處? –

6

你被允許定義一個宏cleanup,因爲它是不是被保留到編譯器的名稱。您不能定義一個名爲__cleanup__的名稱。這可以確保您使用__cleanup__的代碼不受其他代碼的影響(當然,前提是其他代碼的行爲)。

+0

偉大的附加信息;謝謝! –