我不清楚在C.中使用__attribute__
关键字我已经阅读了gcc的相关文档,但我仍然无法理解这一点。可以帮助理解一些。
答案 0 :(得分:6)
__attribute__
不是C的一部分,但是GCC中的扩展,用于向编译器传递特殊信息。 __attribute__
的语法被选择为C预处理器可以接受而不会改变(默认情况下,无论如何),因此它看起来很像函数调用。但它不是函数调用。
与编译器可以学习的关于C代码的大部分信息(通过阅读它)一样,编译器可以通过__attribute__
数据以多种不同的方式利用它学到的信息 - 甚至使用相同的部分有时,数据有多种方式。
pure
属性告诉编译器一个函数实际上是一个数学函数 - 只使用它的参数和语言规则来得到它的答案而没有其它副作用。知道这一点,编译器在调用纯函数时可能能够更好地进行优化,但是在编译纯函数时也可以使用它来警告你函数是否确实做了一些使它不纯的东西。
如果您可以记住(即使其他一些编译器支持它们)属性是GCC扩展而不是C的一部分,并且它们的语法不能以优雅的方式适合C(只够愚弄预处理器)然后你应该能够更好地理解它们。
你应该尝试使用它们。选择那些更容易理解功能的功能并试用它们。对数据执行相同的操作(可能有助于查看GCC的程序集输出,但是sizeof
并检查对齐通常会有帮助。)
答案 1 :(得分:3)
将其视为将语法注入源代码的一种方法,源代码不是标准C,而是仅用于GCC编译器的使用。但是,当然,您注入此语法不是为了它的乐趣,而是为编译器提供有关它所附加的元素的附加信息。
您可能希望指示编译器在特定对齐方式中将某个变量对齐到内存中。或者您可能希望声明一个不推荐使用的函数,以便当其他人尝试在其程序中使用它时,编译器将自动生成不推荐的警告(在库中很有用)。或者您可能希望将符号声明为弱符号,以便在未找到任何其他定义时将其作为最后的手段进行链接(在提供默认定义时很有用)。
所有这些(以及更多)都可以通过将正确的属性附加到程序中的元素来实现。您可以将它们附加到variables和functions。
看看这一堆其他GCC extensions to C。属性机制是这些扩展的一部分。
答案 2 :(得分:2)
单个答案的属性太多,但示例有帮助。 例如, attribute ((aligned(16)))使编译器在16位堆栈边界上对齐该结构/函数。
属性((noreturn))告诉编译器这个函数永远不会到达终点(例如标准函数,如exit(int))
属性((always_inline))使编译器内联该函数,即使它通常不会选择(使用inline关键字向编译器建议您希望它内联,但它是可以随意忽略你 - 这个属性强迫它。)
基本上,它们主要是告诉编译器你比它更了解,或者在函数的基础上覆盖函数的默认编译器行为。
答案 3 :(得分:0)
GNU C最好(但鲜为人知)的一个特性是属性机制,它允许开发人员将特性附加到函数声明,以允许编译器执行更多错误检查。它的设计方式与非GNU实现兼容,我们多年来一直在高度可移植的代码中使用它,效果非常好。
请注意,属性拼写为前两个下划线,后面两个下划线,并且内容周围总是有两组括号。这有一个很好的理由 - 见下文。 Gnu CC需要使用-Wall编译器指令来启用它(是的,有更好的警告控制可用,但无论如何我们都是最大警告的粉丝)。
有关详情,请转至http://unixwiz.net/techtips/gnu-c-attributes.html
Lokesh Venkateshiah