Veraltetes Attribut in C ++ 14

Ursprünglicher Autor: Joseph Mansfield
  • Übersetzung
  • Tutorial
Die normale Entwicklung eines Codes ist die Überalterung seiner einzelnen Teile (Funktionen, Klassen usw.) und deren systematische Entfernung aus dem Projekt, um die Komplexität zu verringern und die Codesicherheit zu verbessern. Nur etwas zu entfernen ist normalerweise eine schlechte Idee - es könnte eine Komponente beschädigen, die die zu löschende Entität verwendet. Es hat sich bewährt, veralteten Code so zu kennzeichnen, dass Programmierer ihn verwenden können, um zu wissen, dass das Entfernen geplant ist. ( Anmerkung Übersetzer - Microsoft erfand sein Fahrrad für dieses und Leute verwendeten manchmal #pragma Anzeige ).

Neuer C ++ 14-Standard führt veraltetes Attribut einum veraltete Objekte zu markieren, die in Zukunft gelöscht werden sollen. Der Compiler kann bei jedem Versuch, sie zu verwenden, Warnungen anzeigen. Die Syntax ist in C ++ grundsätzlich neu: Attribute sollen in doppelten eckigen Klammern als durch Kommas getrennte Liste geschrieben werden. So sieht die als veraltet gekennzeichnete Funktion aus:

[[deprecated]]
void foo() {}
int main() {
	foo(); // в этом месте компилятор выведет предупреждение
}


Andere mögliche Attribute: noreturn, carry_dependency, alignas

Der obige Code, der vom letzten Build von clang kompiliert wurde, gibt in der Kompilierungsphase die folgende Meldung aus:

warning: 'foo' is deprecated [-Wdeprecated-declarations]
        foo();
        ^
note: 'foo' has been explicitly marked deprecated here
void foo() {}
     ^


Es ist auch möglich, Ihre eigene Nachricht anzuzeigen:

[[deprecated("use bar instead")]]
void foo() {}
This gives the following warning instead:
warning: 'foo' is deprecated: use bar instead [-Wdeprecated-declarations]
        foo();
        ^
note: 'foo' has been explicitly marked deprecated here
void foo() {}
     ^


Das veraltete Attribut gilt auch für Klassen, typedefs, Variablen, nicht statische Datenelemente, Aufzählungen und Vorlagen. Hier einige Beispiele:

// помечаем функцию
[[deprecated]]
void foo();
// помечаем переменную
[[deprecated]]
int x;
// помечаем только одну переменную в списке определяемых
int y [[deprecated]], z;
// помечаем параметр функции
int triple([[deprecated]] int x);
// помечаем класс или структуру
class [[deprecated]] my_class {
	public:
		// помечаем член класса
		[[deprecated]] int member;
};
// помечаем перечисление
enum [[deprecated]] animals {
	CAT, DOG, MOUSE
};
// помечаем typedef
[[deprecated]]
typedef int type;
// помечаем специализацию шаблона
template  class templ;
template <>
class [[deprecated]] templ {};

Für diejenigen, die die auffällige Inkonsistenz der Platzierung von Attributen bemerken (zum Beispiel ihre Verwendung nach den Schlüsselwörtern class und enum), möchte ich sagen, dass dies dazu dient, die Marke des Typs selbst von der Marke einer Variablen dieses Typs zu unterscheiden. Die folgende Deklaration markiert beispielsweise eine Variable, jedoch nicht die Klasse selbst:

[[deprecated]] class C { } c;


Das veraltete Attribut kann nur in einer Definition einer Entität angegeben werden, alle folgenden Deklarationen ohne dieses Attribut entfernen das veraltete Attribut nicht . Platzieren Sie das Attribut am besten in der Header-Datei. Dadurch werden alle Benutzer darüber informiert, dass die Entität veraltet ist und gelöscht wird.

Das Attribut wird seit Clang 3.4 und GCC 4.9 unterstützt.

Hinweise für Übersetzer: Die Attribute, die im C ++ 11-Standard enthalten waren, waren vielversprechend - eine neue Möglichkeit, Funktionen, Klassen und anderen Dingen Metadaten hinzuzufügen, eröffnete potenziell große Möglichkeiten für Metaprogrammierung, Reflexion und Testen - C # und Python haben sich letztendlich bereits als echte Vorteile erwiesen von solchen Sprachtools, und ich persönlich wollte glauben, dass C ++ in Zukunft etwas ähnliches bekommen würde. Leider haben die ersten eingeführten Attribute ( noreturn , carry_dependency , alignas ) einen kleinen Vorteil gebracht, der den positiven Eindruck des Features trübte . Veraltet ist meiner Meinung nach das erste wirklich einfache, verständliche und notwendige Attribut für jedermann. Ich würde gerne glauben, dass dies ein Schritt auf dem Weg zu weiteren Merkmalen der Sprache ist, die auf Attributen basieren.

Jetzt auch beliebt: