Я помещаю [[возможно неиспользованный]] в объявления или определения функций?

С++ 17 вводит атрибут [[maybe_unused]].
Я предполагаю, что это стандартизованная версия GCC и Clang's: __ атрибут __ ((не используется)).

Для неиспользуемых функций, от которых я не хочу видеть предупреждение,
должен ли я указывать атрибут на

объявления функций?

void maybe_used_function() [[maybe_unused]];

или определения функций?

void maybe_used_function() [[maybe_unused]] {
  /* impl */
}

Либо один? Оба?
Будет ли эффект одинаковым как для стандартизованных, так и для специфических атрибутов компилятора?
Я не могу найти четкую документацию о поведении размещения и о том, что такое обычная практика.


Когда я помещаю атрибут перед телом функции в определение, GCC и clang выдают ошибку:

void function();
int main(){}
void function() __attribute__((unused)) {}  

предупреждение: GCC не позволяет использовать атрибут "неиспользуемый" в этой позиции     по определению функции [-Wgcc-compat] void function() __attribute __ ((не используется)) {


Однако атрибут может быть помещен в два других места без ошибок:

__attribute__((unused)) void __attribute__((unused)) function() {}

Возможно, один из этих способов заключается в том, как я должен использовать атрибут в определениях функций?

Ответ 1

Из N4606, [dcl.attr.unused] ¶4:

Имя или объект, объявленные без атрибута maybe_unused, могут быть позже обновлены с помощью атрибута и наоборот. Сущность считается отмеченной после первого объявления, которое ее маркирует.

Поскольку определение функции является объявлением ([dcl.dcl] ¶1), это означает, что вы можете поместить его в любом месте и он будет вести себя одинаково.

(Имеет смысл разрешаться в обоих местах, поскольку атрибут влияет только на определение, но поскольку атрибут может служить самодокументацией, он также разрешен в декларации.)

Ответ 2

Ни. В

[[attr1]] void [[attr2]] f [[attr3]] () [[attr4]] {}
  • attr1 и attr3 appertain (или применить) к самому f.
  • attr2 относится к предыдущему типу, void.
  • attr4 appertains to f type ("function of () return void), а не f.

Вы хотите, чтобы maybe_unused располагался до f, поэтому вы можете поместить его в положение 1 или 3, но не 2 или 4.

ответ @ildjarn охватывает остальные.

Для GCC __attribute__ вам нужно будет проверить его документацию.