2016-07-21 3 views
10

C++ 17 вводит атрибут [[maybe_unused]].
Я предполагаю, что это стандартизованная версия GCC и Clang's: __attribute__((unused)).Я помещаю [[возможно не используется]] в объявления функций или определения?

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

функции?

void maybe_used_function() [[maybe_unused]]; 

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

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

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


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

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

предупреждение: НКУ не позволяет «неиспользуемый» атрибут в этом положении на определение функции [-Wgcc-Compat] недействительными() функция __attribute __ ((неиспользованные)) {


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

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

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

+0

Вы * попробовали * и посмотрели, что на самом деле говорит компилятор? AFAIK, атрибуты идут по объявлениям * только *, но я не дважды проверял стандартный текст. –

+0

@JesperJuhl: В этом случае компилятор ошибочен, и это далеко не необычно, особенно при обсуждении функций языка _upcoming_, которые могут или не могут быть реализованы правильно (или вообще). – ildjarn

+0

@ildjarn Ошибка GCC возникла из '__attribute __ ((не используется))' not '[[maybe_unused]]'. Кажется, Кланг делает то же самое. –

ответ

5

С N4606, [dcl.attr.unused] ¶4:

A name or entity declared without the maybe_unused attribute can later be redeclared with the attribute and vice versa. An entity is considered marked after the first declaration that marks it.

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

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

19

ни. В

[[attr1]] void [[attr2]] f [[attr3]]() [[attr4]] {} 
  • attr1 и attr3 относиться (или применить) к f сам.
  • attr2 относится к предыдущему типу, void.
  • attr4 appertains типу f «s (" функция () возвращающегося void), не f.

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

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

для ССЗ __attribute__, вы должны проверить документацию.