Мой вопрос имеет прямое отношение к __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?
Вот фрагмент из доступных документов GCC 4.0 Вот.
The keyword __attribute__ allows you to specify special attributes when making a
declaration.
Обратите внимание, что это говорит «декларация», а не «определение». это Старая статья о Unix Wiz также содержит много полезных советов. Он также говорит об использовании атрибутов в объявлениях.
Как говорит Шон Перри, похоже, что НКУ только указывает, что специальные атрибуты могут использоваться с объявлениями.
Я копал еще немного в ARMCC документы и, наконец, нашел то, что я искал Вот:
Вы можете установить эти атрибуты функции в объявлении, определении или обоих.
Итак, для ARMCC мой использование __attribute__
как показано в OP, безопасно, но это не так для GCC.