« deprecated, atrybut, C++ »
deprecated - Atrybut, przy pomocy którego można zaznaczyć pewne typy, obiekty, funkcje, argumenty funkcji, zmienne jako przestarzałe, wtenczas użycie tych rzeczy spowoduje ostrzeżenie kompilatora. (atrybut)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
Hasło nie zostało zweryfikowane
Niniejsze hasło zostało opracowane, jednak nie zostało ono zweryfikowane przez administrację serwisu. Jeżeli znalazłeś błędy merytoryczne w niniejszym dokumencie, prosimy o ich zgłoszenie na forum w dziale Znalezione błędy.
Opracował: baziorek
« Standard C++14 »

deprecated

[atrybut] Atrybut, przy pomocy którego można zaznaczyć pewne typy, obiekty, funkcje, argumenty funkcji, zmienne jako przestarzałe, wtenczas użycie tych rzeczy spowoduje ostrzeżenie kompilatora.

Składnia

Ogólna składnia używania atrybutów

C/C++
[[ atrybut ] ]
[[ atrybut1, atrybut2, atrybut3( argumenty ) ] ][[ namespace::atrybut( argumenty ) ] ]
[[ atrybuty...] ]

/// innymi słowy składnia:
[[ lista - atrybutow ] ]
[[ using attribute - namespace
    : lista - atrybutow ] ] // C++17
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

C/C++
[[ deprecated ] ]
[[ deprecated( "powod, dlaczego jest przestarzale" ) ] ]

Opis szczegółowy

Atrybut
[[ deprecated ] ]
, służy do oznaczania jako przestarzałe:
  • typów
  • obiektów
  • funkcji
  • argumentów funkcji
  • specjalizacji szablonów
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:
C/C++
__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

C/C++
[[ 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

C/C++
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

C/C++
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:
C/C++
[[ 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:
C/C++
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

C/C++
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

C/C++
[[ 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

C/C++
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

C/C++
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