2016-07-21 40 views
10

C++ 17 wprowadza atrybut [[maybe_unused]].
Zakładam, że jest to standardowa wersja GCC i Clang: __attribute__((unused)).Czy umieściłem [[być może nieużywane]] w deklaracjach funkcji lub definicjach?

Dla nieużywanych funkcji, które nie chcą, aby zobaczyć ostrzeżenie,
Byłbym określając atrybut deklaracji

funkcyjnych?

void maybe_used_function() [[maybe_unused]]; 

lub definicje funkcji?

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

czy jeden? Obie?
Czy efekt będzie taki sam dla atrybutu standardowego i dla kompilatora?
Nie mogę znaleźć żadnej jasnej dokumentacji na temat zachowań w zakresie umieszczania i jaka jest powszechna praktyka.


Kiedy umieścić atrybut przed ciele funkcji w definicji, GCC i brzęk daje błąd:

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

ostrzeżenie: GCC nie pozwala „niewykorzystane” atrybut w tej pozycji na definicja funkcji [-Wgcc-compat] nieważny() funkcji __attribute __ ((niewykorzystane)) {


Jednak atrybut może być umieszczone w dwóch innych miejscach bez błędu:

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

Może któryś z tych sposobów jest jak jestem spodziewałem się użyć atrybutu w definicji funkcji?

+0

Czy * wypróbowałeś * i zobaczysz, co faktycznie mówi kompilator? AFAIK, atrybuty przechodzą na deklaracje * tylko *, ale nie sprawdziłem podwójnie standardowego tekstu. –

+0

@JesperJuhl: W tym przypadku kompilator jest nieprawidłowy i nie jest to niezwykłe, zwłaszcza podczas omawiania funkcji języka poprzedzającego, które mogą, ale nie muszą być implementowane poprawnie (lub w ogóle). – ildjarn

+0

@ildjarn Błąd GCC pochodzi z '__attribute __ ((nieużywany))' not' [[maybe_unused]] '. Clang wydaje się robić to samo. –

Odpowiedz

5

Od 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.

Ponieważ definicja funkcji jest deklaracja ([dcl.dcl] ¶1), oznacza to, można umieścić go w dowolnym miejscu i będzie zachowywać się tak samo.

(ma to sens, aby móc w obu miejscach, ponieważ atrybut tylko faktycznie wpływa na definicję, ale dlatego, że atrybut może służyć jako samodzielnego dokumentacji jest również dozwolone w zgłoszeniu).

19

Ani. W

[[attr1]] void [[attr2]] f [[attr3]]() [[attr4]] {} 
  • attr1 i attr3 odnosić się (lub zastosowania) do f sama.
  • attr2 należy do poprzedniego typu, void.
  • attr4 appertains rodzaju f „s (" funkcja () powracającego void), nie f.

Chcesz maybe_unused aby odnosić się do f, dzięki czemu można umieścić go w pozycji 1 lub 3, ale nie 2 lub 4.

@ildjarn's answer obejmuje resztę.

dla GCC __attribute__, trzeba sprawdzić jego dokumentację.