2015-09-25 86 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

伟大的附加信息;谢谢! –