Macros gcc预编译器指令uuuu属性uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

Macros gcc预编译器指令uuuu属性uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,macros,c-preprocessor,preprocessor-directive,Macros,C Preprocessor,Preprocessor Directive,我正在学习gcc,学习它如何在变量超出范围时调用要运行的函数,我不明白为什么可以使用带下划线或不带下划线的单词“cleanup”。带下划线版本的文档或文档在哪里 上述gcc文档如下所示: __attribute__ ((cleanup(cleanup_function))) __attribute__ ((__cleanup__(cleanup_function))) 但是,我读到的大多数代码示例都是这样显示的: __attribute__ ((cleanup(cleanup_functio

我正在学习gcc,学习它如何在变量超出范围时调用要运行的函数,我不明白为什么可以使用带下划线或不带下划线的单词“cleanup”。带下划线版本的文档或文档在哪里

上述gcc文档如下所示:

__attribute__ ((cleanup(cleanup_function)))
__attribute__ ((__cleanup__(cleanup_function)))
但是,我读到的大多数代码示例都是这样显示的:

__attribute__ ((cleanup(cleanup_function)))
__attribute__ ((__cleanup__(cleanup_function)))
例:

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

为什么不同?与
清理
相反,在哪里定义或记录了
清理

我的根本问题在于,我不知道我不知道的东西,因此我试图暴露我的一些未知的未知,使它们成为已知的未知,直到我能够研究它们,使它们成为已知的未知

我的想法是,gcc预处理器指令可能有一些全局应用的原则,您可以在它们之前或之后任意添加下划线?--或者也许只是其中的一部分或者它以某种方式修改了预处理器指令或属性,在某些情况下,一种方法(带或不带额外下划线)优于另一种方法?

如所述:

您可以选择在属性名称前后指定属性名称。这允许您在头文件中使用它们,而不必担心可能的同名宏。例如,您可以使用属性名
\uuuu noreturn\uuu
而不是
noreturn


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

您可以定义宏
清理
,因为它不是编译器保留的名称。您不允许定义名为
\uuuuu cleanup\uuuu
的文件。这保证了使用
\uuuuuu cleanup\uuuuuu
的代码不受其他代码的影响(当然,前提是其他代码的行为)。

您显示的第一个链接提示(如果不是直接声明的话)
cleanup
\uuuuu cleanu\uuuu
是相同的。此外,鉴于您已经将此标记为C++,我还将提到,它的最佳目的是在C样式代码中使用RAII语义。一般来说,C++中应该把需要清理的东西包装成一个具有析构函数的类(并且意味着通过C++的三或五的规则或11的规则或更新的规则,也需要构造函数和/或移动运算符)。我对我的问题作了进一步的阐述。第一个链接确实指出它们是相同的,但我想知道这对我使用的其他属性意味着什么……同一事物总是有多个选项吗?这家伙怎么知道他们是一模一样的?当然,这种差异肯定存在某种原因。请参阅我的更新答案,了解我的一些奇妙之处。谢谢。如果不是预处理器指令,那么属性是什么?如何定义预处理器指令?还有,是否有术语“编译器指令”?这有什么区别?预处理器指令是类似于
#include
#define
#ifdef
,等等的东西。那么,您称之为
(属性)
?如果不是一个“指令”,这类东西的好词是什么?它是一个(非标准扩展)关键字。