Składnia
Ogólna składnia używania atrybutów
[[ atrybut ] ]
[[ atrybut1, atrybut2, atrybut3( argumenty ) ] ][[ namespace::atrybut( argumenty ) ] ]
[[ atrybuty...] ]
[[ lista - atrybutow ] ]
[[ using attribute - namespace
: lista - atrybutow ] ]
Lista atrybutów jest sekwencją zera lub większej liczby atrybutów rozdzielonej przecinkami, możliwe jest też aby lista kończyła się wielokropkiem
...
.
Składnia użycia atrybutu deprecated
[[ deprecated ] ]
[[ deprecated( "powod, dlaczego jest przestarzale" ) ] ]
Opis szczegółowy
Atrybut
[[ deprecated ] ]
, służy do oznaczania jako przestarzałe:
Użycie tych rzeczy spowoduje ostrzeżenie kompilatora.
Można jako opcjonalny argument napisać tekstowo dlaczego dany element jest przestarzały, komunikat ten zostanie wyświetlony przez kompilator gdy będziemy używać danego elementu.
Wymagania
Atrybuty dostarczone przez poszczególne kompilatory istnieją już od dawna, standardowe atrybuty pojawiły się w standardzie C++11, natomiast atrybut
[[ deprecated ] ]
pojawił się dopiero w C++14.
Implementacja
Przed standardem C++14 taka funkcjonalność była dostarczana przez kompilatory. Przykładowo dla g++-7.3:
__attribute__(( deprecated ) ) void staraFunkcja()
{
}
__attribute__(( deprecated( "Niebezpieczna watkowo" ) ) ) void staraFunkcja2()
{
}
struct __attribute__(( deprecated ) ) StaraKlasa
{
};
int main()
{
staraFunkcja();
staraFunkcja2();
StaraKlasa sk;
}
Standardowe wyjście programu:
tmp.cc: In function ‘int main()’:
tmp.cc:16:18: warning: ‘void staraFunkcja()’ is deprecated [-Wdeprecated-declarations]
staraFunkcja();
^
tmp.cc:2:37: note: declared here
__attribute__(( deprecated ) ) void staraFunkcja()
^~~~~~~~~~~~
tmp.cc:17:19: warning: ‘void staraFunkcja2()’ is deprecated: Niebezpieczna watkowo [-Wdeprecated-declarations]
staraFunkcja2();
^
tmp.cc:6:64: note: declared here
__attribute__(( deprecated( "Niebezpieczna watkowo" ) ) ) void staraFunkcja2()
^~~~~~~~~~~~~
tmp.cc:19:16: warning: ‘StaraKlasa’ is deprecated [-Wdeprecated-declarations]
StaraKlasa sk;
^~
tmp.cc:10:39: note: declared here
struct __attribute__(( deprecated ) ) StaraKlasa
^~~~~~~~~~
Przykład
Przykładowy output jest dla g++ w wersji 7.3.
Przestarzałe funkcje
[[ deprecated ] ] void f()
{ }
int main()
{
f();
}
Standardowe wyjście programu:
tmp.cc: In function ‘int main()’:
tmp.cc:7:5: warning: ‘void f()’ is deprecated [-Wdeprecated-declarations]
f();
^
tmp.cc:1:21: note: declared here
[[deprecated]] void f()
^
Przestarzałe klasy
class[[ deprecated ] ] C
{ };
int main()
{
C c;
}
Standardowe wyjście programu:
tmp.cc: In function ‘int main()’:
tmp.cc:6:7: warning: ‘C’ is deprecated [-Wdeprecated-declarations]
C c;
^
tmp.cc:1:22: note: declared here
class [[deprecated]] C
^
Przestarzałe enumy
enum[[ deprecated ] ] E
{
E1, E2
};
int main()
{
E e;
}
Standardowe wyjście programu:
tmp.cc: In function ‘int main()’:
tmp.cc:8:6: warning: ‘E’ is deprecated [-Wdeprecated-declarations]
E e;
^
tmp.cc:1:21: note: declared here
enum [[deprecated]] E
^
Przestarzałe stałe i zmienne
Można zaznaczyć jako przestarzałem wszystkie zmienne znajdujące się w ramach jednej definicji, jak również pojedyńcze zmienne z wielu zdefiniowanych w ramach jednej definicji.
Stałe:[[ deprecated ] ] const int BUFFER_SIZE = 100;
int main()
{
const char buffer[ BUFFER_SIZE ] = "Ala ma kota";
}
Standardowe wyjście programu:
tmp.cc: In function ‘int main()’:
tmp.cc:5:23: warning: ‘BUFFER_SIZE’ is deprecated [-Wdeprecated-declarations]
const char buffer[BUFFER_SIZE] = "Ala ma kota";
^~~~~~~~~~~
tmp.cc:1:26: note: declared here
[[deprecated]] const int BUFFER_SIZE = 100;
^~~~~~~~~~~
Zmienne:int x, y, z[[ deprecated ] ];
int main()
{
x = y = z = 0;
}
Standardowe wyjście programu:
tmp.cc: In function ‘int main()’:
tmp.cc:5:13: warning: ‘z’ is deprecated [-Wdeprecated-declarations]
x = y = z = 0;
^
tmp.cc:1:11: note: declared here
int x, y, z [[deprecated]];
^
Przestarzałe argumenty
bool f( int i,[[ deprecated ] ] int j )
{
return i == j;
}
Standardowe wyjście programu:
mp.cc: In function ‘bool f(int, int)’:
tmp.cc:3:17: warning: ‘j’ is deprecated [-Wdeprecated-declarations]
return i == j;
^
tmp.cc:1:34: note: declared here
bool f(int i, [[deprecated]] int j)
^
Przestarzałe przezwiska typów
[[ deprecated ] ] typedef int Number;
int main()
{
Number n = 44;
}
Standardowe wyjście programu:
tmp.cc: In function ‘int main()’:
tmp.cc:5:12: warning: ‘Number’ is deprecated [-Wdeprecated-declarations]
Number n = 44;
^
tmp.cc:1:28: note: declared here
[[deprecated]] typedef int Number;
^~~~~~
Przestarzałe specjalizacje szablonów
template < typename T >
struct Template;
template <>
struct[[ deprecated ] ] Template < int > { };
int main()
{
Template < int > t;
}
Standardowe wyjście programu:
tmp.cc: In function 'int main()':
tmp.cc:10:19: warning: 'Template' is deprecated [-Wdeprecated-declarations]
Template<int> t;
^
tmp.cc:6:23: note: declared here
struct [[deprecated]] Template<int> {};
^
Przestarzałe pola klasy
class MyClass {
public:
[[ deprecated ] ] int member = 44;
};
int main()
{
MyClass m;
}
Standardowe wyjście programu:
tmp.cc: In constructor ‘constexpr MyClass::MyClass()’:
tmp.cc:1:7: warning: ‘MyClass::member’ is deprecated [-Wdeprecated-declarations]
class MyClass {
^~~~~~~
tmp.cc:3:35: note: declared here
[[deprecated]] int member = 44;
^~
tmp.cc: In function ‘int main()’:
tmp.cc:8:13: note: synthesized method ‘constexpr MyClass::MyClass()’ first required here
MyClass m;
^
Linki zewnętrzne
Linki zewnętrzne