__attribute__修饰符可以同时用于函数原型和函数定义吗?

10

我的问题与__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?


好的,这取决于编译器...我认为它会根据指令而改变。 - Grady Player
2个回答

10
这里是来自GCC 4.0文档的片段,可以在这里找到。
The keyword __attribute__ allows you to specify special attributes when making a
declaration.

请注意,它说的是“声明”,而不是“定义”。这篇较老的Unix Wiz文章(链接)也提供了许多好的建议。它还建议在声明中使用属性。

1
为了完整起见,当前文档在此处:https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html - alk
在Debian的gcc 10.2.1上,属性可以用于函数声明,但是属性必须出现在声明符之前,即在函数签名之前。我不知道是否可以按要求同时使用两者。 - crass

1
正如Sean Perry所说,似乎只有GCC指定可以在声明中使用特殊属性。
我进一步查阅了ARMCC文档,并最终在这里找到了我要的内容:
“您可以在声明、定义或两者中设置这些函数属性。”
因此,在ARMCC中,我在OP中展示的使用__attribute__是安全的,但对于GCC则不是这样。

感谢提供ARMCC位。我对它或其文档不够熟悉。既然您要求其中之一,我想提到它与GCC的不当使用就足够了。 - Sean Perry
@Sean 很好的观点。你回答了我的关于GCC的问题,所以我选择了你的答案作为正确答案。感谢你为我找到这些信息。在我提问之前,我已经阅读了GCC文档中的那一部分,但是我脑海中一直想着“原型”,而没有考虑“声明”。你找到了很好的答案。 - embedded_guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接