8

我的问题直接与其他问题有关,__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 一起使用?

4

2 回答 2

7

这是来自 GCC 4.0 文档的片段,可在此处获得。

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

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

于 2014-05-28T16:53:22.923 回答
1

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

我正在深入研究ARMCC文档,最后在这里找到了我想要的东西

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

因此,对于 ARMCC,使用__attribute__OP 中所示的方法是安全的,但对于 GCC 则不然。

于 2014-05-28T17:25:47.503 回答