gcc预编译器指令__attribute __((__ cleanup__))vs((清理))(vs没有下划线?)

Gab*_*les 2 macros c-preprocessor preprocessor-directive

我正在学习gcc的清理属性,并了解当变量超出范围时它如何调用函数运行,我不明白为什么你可以使用带有或不带下划线的"清理"一词.下划线的版本的文档或文档在哪里?

上面的gcc文档显示如下:

__attribute__ ((cleanup(cleanup_function)))
Run Code Online (Sandbox Code Playgroud)

但是,我读过的大多数代码示例都显示如下:

__attribute__ ((__cleanup__(cleanup_function)))
Run Code Online (Sandbox Code Playgroud)

例如:

请注意,第一个示例链接表明它们是相同的,当然编码证明了这一点,但他最初是如何知道的?这个是从哪里来的?

为什么不同?在哪里__cleanup__定义或记录,而不是cleanup

我的根本问题在于我不知道我不知道的事实,因此我试图暴露我未知的一些未知因素,以便他们成为众所周知的未知数,直到我能够研究它们并使它们成为已知的知识.

我的想法是,gcc预处理器指令可能有一些全局应用的原则,你可以在任何指令之前或之后任意添加下划线? - 或者也许只有其中一些? - 或者它可能以某种方式修改预处理程序指令或属性,并且有些情况下,一个方法(有或没有额外的下划线)优先于另一个方法?

Ulr*_*rdt 7

您可以定义宏cleanup,因为它不是为编译器保留的名称.您不能定义一个名为__cleanup__.这可以保证您的代码使用__cleanup__不受其他代码的影响(当然,前提是其他代码的行为).


mel*_*ene 5

https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax所述

您可以选择在属性名称的__前面和后面指定属性名称。这使您可以在头文件中使用它们,而不必担心可能存在相同名称的宏。例如,您可以使用属性名称__noreturn__代替noreturn

(但请注意,属性不是预处理程序指令。)