Можно ли использовать спецификатор __attribute__ как с прототипом функции, так и с определением функции?

Мой вопрос имеет прямое отношение к __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

Решение

Вот фрагмент из доступных документов GCC 4.0 Вот.

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

Обратите внимание, что это говорит «декларация», а не «определение». это Старая статья о Unix Wiz также содержит много полезных советов. Он также говорит об использовании атрибутов в объявлениях.

3

Другие решения

Как говорит Шон Перри, похоже, что НКУ только указывает, что специальные атрибуты могут использоваться с объявлениями.

Я копал еще немного в ARMCC документы и, наконец, нашел то, что я искал Вот:

Вы можете установить эти атрибуты функции в объявлении, определении или обоих.

Итак, для ARMCC мой использование __attribute__ как показано в OP, безопасно, но это не так для GCC.

0

По вопросам рекламы [email protected]