【发布时间】:2015-09-25 15:08:17
【问题描述】:
我正在学习 gcc 的 cleanup attribute,并学习当变量超出范围时它如何调用要运行的函数,我不明白为什么您可以使用带或不带下划线的“清理”一词. 带有下划线的版本的文档或文档在哪里?
上面的 gcc 文档是这样显示的:
__attribute__ ((cleanup(cleanup_function)))
但是,我阅读的大多数代码示例都是这样显示的:
__attribute__ ((__cleanup__(cleanup_function)))
例如:
- http://echorand.me/site/notes/articles/c_cleanup/cleanup_attribute_c.html
- http://www.nongnu.org/avr-libc/user-manual/atomic_8h_source.html
请注意,第一个示例链接表明它们是相同的,当然编码证明了这一点,但他最初是怎么知道的呢?这是哪里来的?
为什么不一样? __cleanup__ 在哪里定义或记录,而不是 cleanup?
我的根本问题在于我不知道我不知道什么,因此我试图暴露我的一些未知的未知数,以便它们成为已知的未知数,直到我可以研究它们并使它们为人所知。
我的想法是,gcc 预处理器指令可能有一些全球适用的原则,您可以在其中任意添加下划线之前或之后? ——或者也许只是其中的一部分? -- 或者它以某种方式修改了预处理器指令或属性,并且在某些情况下,一种方法(带或不带额外下划线)优于另一种方法?
【问题讨论】:
-
您提供的第一个链接暗示(如果不是直接声明)
cleanup和__cleanup__是相同的。此外,鉴于您已将其标记为 C++,我还将提到它的最佳目的似乎是在 C 样式代码中使用 RAII 语义。一般来说,在 C++ 中,您应该将需要清理的东西包装到具有析构函数的类中(并暗示 - 通过 c++11 或更高版本的三规则或五规则 - 您还需要构造函数和/ 或移动运算符)。 -
谢谢。我进一步阐述了我的问题。第一个链接确实说明它们是相同的,但我想知道这对我使用的其他属性意味着什么……是否总是有多个相同的选项?这家伙怎么知道他们是一样的?当然,这种差异肯定存在某种原因。请参阅我的更新答案,了解我的一些疑惑。
标签: macros c-preprocessor preprocessor-directive