Я помещаю [[возможно неиспользованный]] в объявления или определения функций?
С++ 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__
вам нужно будет проверить его документацию.