2016-03-29 17 views
12

Widzę, Q_NULLPTR używane swobodnie w kodzie źródłowym Qt i przykłady, ale nie znalazłem dokumentacji, co to jest dokładnie i kiedy należy go używać.Kiedy używać Q_NULLPTR?

Na przykład w tej oficjalnej demonstration nowego modułu Qt SerialBus dodanej w nowym Qt v5.6:

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

Czy to służyć celowi nullptr przed tym dodawanych w C++ 11? Jeśli tak, teraz, gdy mamy C++ 11, czy powinienem używać Q_NULLPTR?

PS: Próbowałem wyszukać kod źródłowy Qt dla definicji makra, ale go nie znalazłem.

Odpowiedz

9

Czy to służyło nullptr przed dodaniem w C++ 11? Jeśli tak, teraz, gdy mamy C++ 11, czy powinienem używać Q_NULLPTR?

Tak (nieco) i Nie, odpowiednio.

C++ brakowało w ciągu kilku dni, więc Qt miał swoje własne rzeczy, które później stały się przestarzałe, gdy C++ dogonił funkcje.

Mając na uwadze powyższe, Q_NULLPTR jest (był) nie funkcjonalnie takie same jak nullptr (jak wspomniano Andrei, jeśli C++ 11 jest obsługiwana rozszerza się nullptr) nie daje bezpieczeństwa typu, tylko składni " cukier". To ilustruje zamiar osoby czytającej kod, a nie kompilatorowi, jak to robi.

13

Q_NULLPTR jest makro, które zastępuje się nullptr jeżeli kompilator wspiera C++ 11, jak NULL (który otrzymuje 0), jeżeli nie. Jeśli używasz C++ 11, zamiast tego możesz napisać nullptr; użyj NULL, jeśli nie.

+0

Dobrze wiedzieć – dtech

+5

[Tutaj jest kod źródłowy] (https://code.woboq.org/qt5/qtbase/src/corelib/global/qcompilerdetection.h.html#990) na wypadek, gdyby ktoś potrzebował dowodu. – thuga

2

Aby zachować niezależność od kompilatora, należy użyć Q_NULLPTR.

Jeśli zdecydujesz się teraz na użycie nullptr, Twój kod nie zostanie skompilowany ze starszym kompilatorem C++ 98. Jeśli zdecydujesz się użyć NULL, utracisz bezpieczeństwo typu C++ 11, nawet jeśli jest ono dostępne w aktualnym kompilatorze.

Z tego samego powodu istnieją makra, takie jak qMove(x) i odpowiednie zdefiniuj Q_COMPILER_RVALUE_REFS.

Powiązane problemy