2016-03-29 31 views
12

Ich sehe Q_NULLPTR wird großzügig in Qt Quellcode und Beispiele verwendet, aber ich habe keine Dokumentation gefunden für was genau es ist und wann es verwendet werden sollte.Wann ist Q_NULLPTR zu verwenden?

Zum Beispiel in diesem offiziellen demonstration des neuen Qt SerialBus Modul in der neuen Qt v5.6 hinzugefügt:

if (!m_canDevice->connectDevice()) { 
    delete m_canDevice; 
    m_canDevice = Q_NULLPTR; 

dies den Zweck des nullptr dem vorherigen dienen Hat die C++ 11 aufgenommen zu werden? Wenn ja, jetzt, da wir C++ 11 haben, sollte ich Q_NULLPTR verwenden?

PS: Ich habe versucht, den Qt-Quellcode für die Definition des Makros zu suchen, konnte es aber nicht finden.

Antwort

9

Hat dies den Zweck von nullptr vor dem Hinzufügen in C++ 11 erfüllt? Wenn ja, jetzt, da wir C++ 11 haben, sollte ich Q_NULLPTR verwenden?

Ja (etwas) und Nein jeweils.

C++ war damals ziemlich mangelhaft, also hatte Qt seine eigenen Sachen, die später obsolet wurden, da C++ die Features aufnahm.

Davon abgesehen, ist Q_NULLPTR (war) nicht funktionell die gleiche wie nullptr, (wie Andrei erwähnt, wenn C++ 11 unterstützt wird, dehnt es sich auf nullptr) es nicht geben Sie den Typ Sicherheit, nur Syntax " Zucker". Es zeigte die Absicht für die Person, die den Code liest, nicht für den Compiler, wie es nullptr tut.

13

Q_NULLPTR ist ein Makro, das als nullptr ersetzt wird, wenn Compiler C++ 11 unterstützt und als NULL (die als 0 ersetzt wird), wenn es nicht der Fall ist. Wenn Sie C++ 11 verwenden, können Sie stattdessen nullptr schreiben; Verwenden Sie NULL, wenn Sie dies nicht tun.

+0

Das ist gut zu wissen – dtech

+5

[Hier ist der Quellcode] (https://code.woboq.org/qt5/qtbase/src/corelib/global/qcompilerdetection.h.html#990) falls jemand Beweis benötigt. – thuga

2

Verwenden Sie Q_NULLPTR, um Compiler-unabhängig zu bleiben.

Wenn Sie sich jetzt für die Verwendung von nullptr entscheiden, wird Ihr Code nicht mit einem älteren C++ 98-Compiler kompiliert. Wenn Sie sich dafür entscheiden, NULL zu verwenden, verlieren Sie die Sicherheit vom Typ C++ 11, auch wenn sie in Ihrem aktuellen Compiler verfügbar ist.

Aus dem gleichen Grund existieren Makros wie qMove(x) und die entsprechende Definition Q_COMPILER_RVALUE_REFS.