2010-11-14 16 views
8

Gibt es Q_OBSOLETE oder Q_DEPRECATED in C++ mit Qt 4.7?Wie markiere ich etwas in Qt als veraltet (veraltet)?

Oder gibt es ein ähnliches C++ Makro oder Schlüsselwort?

+0

Was möchten Sie tun so ein Makro oder Stichwort zu tun? – bjoernz

+1

Eine Warnung ausgeben, wenn veraltete Konstrukte in Verwendung sind. Siehe http://en.wikipedia.org/wiki/Deprecation für eine bessere Erklärung. –

Antwort

-2

Mit "veraltete Konstrukte" meinen Sie eigentlich "veraltete Memberfunktionen". Sie fragen nach einer Kompilierungswarnung, um Ihre Aufmerksamkeit auf die Aufrufseite einer veralteten Funktion zu lenken.

Dies ist in Standard C++ in keiner vernünftigen Weise möglich, und ich sehe keine Attribute in G ++, die dies auch unterstützen würden. Qt kann ein solches Feature nicht wirklich hinzufügen, wenn der Compiler noch keine Unterstützung dafür hat.

Allerdings unterstützt Microsoft Visual C++ eine __declspec(deprecated) Erweiterung, und ich könnte mir vorstellen, dass es möglich ist, ein Compiler-Plugin für G ++ 4.5 zu schreiben, das eine ähnliche Funktion hinzufügt.

+0

Es scheint, ich habe '__attribute __ ((veraltet))' in G ++ verpasst. –

0

Sie könnten etwas similiar selbst tun wollen:

#ifdef Q_TREAT_OBSOLETE_AS_ERRORS 
#define Q_OBSOLETE(X) \ 
     BOOST_STATIC_ASSERT(false); \ 
     X 

#else 
#define Q_OBSOLETE(X) X 
#endif 

Diese Konstruktion einfach ersetzt einig veralteten Code/Teil des Codes, wenn es keine Q_TREAT_OBSOLETE_AS_ERRORS definiert ist und ansonsten Kompilierung-Zeitfehler erzeugt.

Beachten Sie, dass BOOST_STATIC_ASSERT keine Bereichsbeschränkungen hat, so gilt das Q_OBSOLETE Makro.

Wahrscheinlich ist dies nicht der beste Weg, um Ihr Problem zu lösen, und ich bin mir nicht sicher, ob dies nützlich ist.

Sie können den Code einfach als @obsolete markieren oder einfach in den Kommentaren darauf hinweisen.

+0

Dies funktioniert nicht. Dies führt zu Kompilierungsfehlern, wenn der veraltete Code ** kompiliert ** ist, unabhängig davon, ob dieser Code von woanders aufgerufen wird oder nicht. –

+0

@Ken Nun, es ist offensichtlich, dass Sie keine Möglichkeit haben, zu überprüfen, ob ein Code-Chunk tatsächlich aufgerufen wird. Diese statische Assertions-Funktion hilft nur, die Aufmerksamkeit auf die Kompilierung veralteter Features zu lenken. * Eigentlich scheint all dieses Q_OBSOLETE-Zeug für mich ziemlich unnötig zu sein.* –

+0

fragt er (glaube ich), weil er an Java gewöhnt ist, der Funktionen als veraltet markieren kann und Ihnen eine Compilerwarnung gibt, wenn Sie versuchen, sie zu benutzen. –

1

gerade die

#warning 

Richtlinie verwenden, obwohl nicht C++ Standard ist ziemlich unwahrscheinlich, dass Sie einen Compiler begegnen, die nicht unterstützt wird (see this SO question).

+0

Windows/MSVC ist ein ziemlich häufiges Ziel für Qt, daher muss ich "ziemlich unwahrscheinlich" widersprechen. –

1
  1. Ziehen Sie die reale Funktion aus dem öffentlichen Bereich.
  2. Erstellen Sie eine andere Funktion mit demselben Namen im öffentlichen Bereich.
  3. Geben Sie in dieser Funktion Ihren Warn-/Fehlercode ein.
  4. Rufen Sie das Original mit dem neuen.
+2

Auf diese Weise kann keine Kompilierungszeitwarnung ausgegeben werden. –

31

Wenn Sie Q_DECL_DEPRECATED verwenden Sie das Ergebnis erhalten, sollten Sie für beispiels suchen .:

Q_DECL_DEPRECATED void foo(); 
+6

sollte dies die akzeptierte Antwort sein. – dom0