【问题标题】:Can an __attribute__ specifier be used with both the function prototype and the function definition?__attribute__ 说明符可以与函数原型和函数定义一起使用吗?
【发布时间】:2014-05-28 16:23:36
【问题描述】:

我的问题直接与__attribute__((noreturn)) 相关,但更普遍的问题也可能与其他问题相关——例如__attribute__(noinline)。我查看了 gcc 手册和 Keil 编译器参考指南,以确定将 __attribute__ 与函数一起使用的正确语法。我一般看到的如下:

void function (void) __attribute__((noreturn));  //Prototype has __attribute__

void function (void)                             //Definition does not.
{
    while (1);
}

我还看到函数定义前使用的__attribute__如下:

__attribute__((noreturn)) void function (void)
{
    while (1);
}

但是,我还没有看到将它与函数原型和函数定义一起使用的示例。我认为在两个位置都有__attribute__ 会提高代码的可读性;通过查看函数原型或已应用属性的定义,我会知道。结果如下:

__attribute__((noreturn)) void function (void) ;  //Prototype has __attribute__

__attribute__((noreturn)) void function (void)    //Definition has __attribute__
{                                               //as well.
    while (1);
}

我已经使用前面提到的方法使用 Keil armcc 编译器成功编译了代码。有什么理由我应该将此方法与 armcc 或 gcc 一起使用?

【问题讨论】:

  • 这取决于编译器......我认为它会根据指令而改变。

标签: c++ c gcc armcc


【解决方案1】:

这里是来自 GCC 4.0 文档的 sn-p 可用 here

The keyword __attribute__ allows you to specify special attributes when making a
declaration.

注意它说的是“声明”而不是“定义”。 This 较早的 Unix Wiz 文章也有很多好的建议。它还说在声明中使用属性。

【讨论】:

【解决方案2】:

正如 Sean Perry 所说,GCC 似乎只指定特殊属性可以与声明一起使用。

我对 ARMCC 文档进行了深入研究,终于找到了我要找的东西 here:

您可以在声明、定义或两者中设置这些函数属性。

因此,对于 ARMCC,my 使用 OP 中显示的 __attribute__ 是安全的,但对于 GCC 则不然。

【讨论】:

  • 感谢 ARMCC 位。我对它或它的文档不够熟悉。既然你要求任何一个,我认为提到它不适用于 GCC 就足够了。
  • @Sean 好点。您确实回答了我关于 GCC 的问题,所以我选择了您的问题作为正确答案。感谢您为我找到信息。我什至在问这个问题之前就阅读了 GCC 文档的那部分,但我脑子里有“原型”,并没有考虑“声明”。很好的发现。
猜你喜欢
  • 2012-06-15
  • 1970-01-01
  • 2011-06-02
  • 2014-01-17
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2011-02-26
  • 2017-06-08
相关资源
最近更新 更多