W C ++ 14 możesz oznaczyć funkcję jako przestarzałą za pomocą [[deprecated]]
atrybutu (zobacz sekcję 7.6.5 [dcl.attr.deprecated]).
Atrybut Token deprecated
może być używany do nazw znaków i podmiotów, których stosowanie jest nadal dozwolone, ale nie jest zalecane z jakiegoś powodu.
Na przykład następująca funkcja foo
jest przestarzała:
[[deprecated]]
void foo(int);
Możliwe jest podanie komunikatu opisującego, dlaczego nazwa lub podmiot zostały wycofane:
[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);
Wiadomość musi być ciągiem znaków.
Aby uzyskać więcej informacji, zobacz „Oznaczanie jako przestarzałe w C ++ 14” .
To powinno załatwić sprawę:
Jednak napotkasz problemy, jeśli typ zwracany przez funkcję ma w nazwie przecinki, np.
std::pair<int, int>
Ponieważ zostanie to zinterpretowane przez preprocesor jako przekazanie 2 argumentów do makra DEPRECATED. W takim przypadku musiałbyś wpisać zwracany typ.Edycja: prostsza (ale prawdopodobnie mniej kompatybilna) wersja tutaj .
źródło
__declspec(deprecated)
teraz, więc makro można uprościć.Oto uproszczona wersja mojej odpowiedzi z 2008 roku :
Zobacz też:
__declspec(deprecated)
__attribute__((deprecated))
__attribute__((deprecated))
źródło
[[deprecate]]
wycofane makra? :-)DEPRECATED void foo(...);
zamiastDEPRECATED(void foo(...));
W GCC możesz zadeklarować swoją funkcję z atrybutem przestarzałym w następujący sposób:
Spowoduje to wyświetlenie ostrzeżenia w czasie kompilacji, gdy ta funkcja zostanie użyta w pliku .c.
Więcej informacji można znaleźć w sekcji „Pragmy diagnostyczne” pod adresem http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html
źródło
Oto pełniejsza odpowiedź na rok 2018.
Obecnie wiele narzędzi pozwala nie tylko oznaczyć coś jako przestarzałe, ale także przekazać wiadomość. Dzięki temu możesz poinformować ludzi, że coś zostało wycofane, i może wskazać im zamianę.
Wciąż istnieje duża różnorodność w obsłudze kompilatorów:
[[deprecated]]
/[[deprecated(message)]]
.__attribute__((deprecated))
jest obsługiwany przez GCC 4.0+ i ARM 4.1+__attribute__((deprecated))
i__attribute__((deprecated(message)))
jest obsługiwany przez:__GNUC__
/__GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)__GNUC__
/__GNUC_MINOR__
, po prostu ustawili go na dowolną wersję GCC)__declspec(deprecated)
od 13.10 (Visual Studio 2003)__declspec(deprecated(message))
od 14,0 (Visual Studio 2005)Możesz również użyć
[[gnu::deprecated]]
w najnowszych wersjach clang w C ++ 11, opartych na__has_cpp_attribute(gnu::deprecated)
.Mam kilka makr w Hedley do obsługi tego wszystkiego automatycznie, które aktualizuję, ale obecna wersja (v2) wygląda tak:
Zostawię to jako ćwiczenie, aby dowiedzieć się, jak pozbyć się makr
*_VERSION_CHECK
i,*_HAS_ATTRIBUTE
jeśli nie chcesz używać Hedley (napisałem Hedley w dużej mierze, więc nie musiałem o tym regularnie myśleć).Jeśli używasz GLib, możesz używać makr
G_DEPRECATED
iG_DEPRECATED_FOR
. Nie są tak wytrzymałe jak te firmy Hedley, ale jeśli już używasz GLib, nie ma nic do dodania.źródło
W przypadku projektów przenośnych jest prawie nieuniknione, że w pewnym momencie będziesz potrzebować sekcji wstępnie przetworzonych alternatyw dla szeregu platform. #ifdef to #ifdef tamto i tak dalej.
W takiej sekcji można bardzo dobrze warunkowo zdefiniować sposób wycofywania symboli. Preferuję zwykle zdefiniowanie makra „ostrzegawczego”, ponieważ większość łańcuchów narzędzi obsługuje niestandardowe ostrzeżenia kompilatora. Następnie możesz przejść do określonego makra ostrzegawczego, który oznacza dezaktualizację itp. W przypadku platform obsługujących dedykowane metody wycofywania możesz użyć tego zamiast ostrzeżeń.
źródło
W przypadku kompilatora Intel Compiler w wersji 19.0 użyj tego w
__INTEL_COMPILER
celu1900
:Działa na następujących poziomach językowych:
Kompilator Intel ma coś, co wygląda na błąd polegający na tym, że nie obsługuje
[[deprecated]]
atrybutu w niektórych elementach języka, tak jak robią to wszystkie inne kompilatory. Na przykład skompiluj wersję 6.0.0 (zadziwiająco wspaniałej) biblioteki {fmtlib / fmt} w serwisie GitHub za pomocą kompilatora Intel Compiler 19.0. To się zepsuje. Następnie zobacz poprawkę w zatwierdzeniu GitHub .źródło
__attribute__((deprecated))
, OTOH, działa w C i C ++, cofając się co najmniej do ICC 13.0, prawdopodobnie znacznie dalej (Intel raczej nie dokumentuje tego typu rzeczy, więc nie jestem pewien).