2016-03-29 36 views
12

Vedo Q_NULLPTR utilizzato liberamente nel codice sorgente Qt e negli esempi, ma non ho trovato alcuna documentazione per quello che è esattamente e quando dovrebbe essere usato.Quando utilizzare Q_NULLPTR?

Ad esempio in questo ufficiale demonstration del nuovo modulo Qt SerialBus aggiunto nella nuova v5.6 Qt:

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

fatto questo hanno lo scopo di nullptr prima di quella che viene aggiunto in C++ 11? Se è così, ora che abbiamo C++ 11, dovrei usare Q_NULLPTR?

PS: Ho provato a cercare il codice sorgente Qt per la definizione della macro ma non sono riuscito a trovarlo.

risposta

9

Questo ha lo scopo di nullptr precedente a quello aggiunto in C++ 11? Se è così, ora che abbiamo C++ 11, dovrei usare Q_NULLPTR?

Sì (un po ') e No rispettivamente.

C++ era piuttosto carente ai tempi, quindi Qt aveva le sue cose, che in seguito sono diventate obsolete quando C++ ha catturato le funzionalità.

Detto questo, Q_NULLPTR è (era) non funzionalmente la stessa nullptr, (come ha osservato Andrei, se C++ 11 è supportato si espande per nullptr) non ti ha dato la sicurezza di tipo, basta sintassi " zucchero". Ha illustrato l'intento alla persona che legge il codice, non al compilatore come fa nullptr.

13

Q_NULLPTR è una macro, che è sostituito come nullptr se compilatore supporta C++ 11 e come NULL (che è sostituito come 0) se non lo fa. Se usi C++ 11, puoi invece scrivere nullptr; utilizzare NULL se non lo fai.

+0

È interessante sapere – dtech

+5

[il codice sorgente è qui sotto] (https://code.woboq.org/qt5/qtbase/src/corelib/global/qcompilerdetection.h.html#990) nel caso in cui qualcuno abbia bisogno di prove. – thuga

2

Utilizzare Q_NULLPTR per rimanere compilatore indipendente.

Se si decide di utilizzare nullptr, il codice non verrà compilato con un compilatore C++ 98 precedente. Se si decide di utilizzare NULL, si perde la sicurezza del tipo C++ 11, anche se disponibile nel compilatore corrente.

Per lo stesso motivo esistono macro come qMove(x) e il corrispondente Q_COMPILER_RVALUE_REFS.