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预处理器指令可能有一些全局应用的原则,你可以在任何指令之前或之后任意添加下划线? - 或者也许只有其中一些? - 或者它可能以某种方式修改预处理程序指令或属性,并且有些情况下,一个方法(有或没有额外的下划线)优先于另一个方法?
您可以定义宏cleanup,因为它不是为编译器保留的名称.您不能定义一个名为__cleanup__.这可以保证您的代码使用__cleanup__不受其他代码的影响(当然,前提是其他代码的行为).
如https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax所述:
您可以选择在属性名称的
__前面和后面指定属性名称。这使您可以在头文件中使用它们,而不必担心可能存在相同名称的宏。例如,您可以使用属性名称__noreturn__代替noreturn。
(但请注意,属性不是预处理程序指令。)