2012-05-08 9 views
7

Powiel możliwe:
“Backporting” nullptr to C++-pre-C++0x programsJak zdefiniować nullptr do obsługi zarówno C++ 03, jak i C++ 11?

Jak zdefiniować nullptr wspierania zarówno C++ 03 i C++ 11?

Czy poniżej kodu kompilowane są zarówno kompilatory C++ 03, jak i C++ 11 bez zmiany znaczenia nullptr w kompilatorze C++ 11?

#include <cstddef> 

#if !defined(nullptr) 
#define nullptr NULL 
#endif 
+5

Czy to prawda? Nie, nie bardzo. Jeśli 'NULL' byłyby równoważne' nullptr', nie byłoby żadnego powodu, aby wprowadzić tę funkcję w pierwszej kolejności. O co nas pytasz? Czy twój kod * skompiluje *? –

+4

Sprawdź to rozwiązanie: http://stackoverflow.com/questions/8747005/backporting-nullptr-to-c-pre-c0x-programs – Alexander

+7

'defined (nullptr)' zawiedzie, ponieważ 'nullptr' jest słowem kluczowym, a nie definiować. – Griwes

Odpowiedz

10

C++ 11 nullptr jest typu nullptr_t. Jednym z jego największych zalet w porównaniu do NULL (lub do 0 powie Bjarne ponieważ nie lubi makra) jest to, że między tymi dwoma funkcjami:

void foo(char*); 
void foo(int); 

foo(nullptr) wywoła przeciążenie char* ale foo(NULL) wywoła przeciążenie int. Zatem twoje rozwiązanie może działać w większości przypadków, ale możesz mieć błędy z przeciążeniem funkcji.

+7

Z pewnością nie jest to jedyna zaleta. Możesz również przeładować 'nullptr_t', co jest całkiem przydatne. –

+3

Odwołanie do argumentu szablonu dedukuje 'nullptr_t' dla' nullptr' i 'int' dla' NULL'. –

8

AFAIK Nie można zautomatyzować kodowania z poziomu kodu, wykrywając obsługę nullptr.

W praktyce można przeczytać, że jako “ niemożliwej ”, to ’ s dość silny “ AFAIK ”.

Należy więc użyć specjalnego kodu i/lub polecenia kompilacji. Na przykład, w każdym odpowiedniego źródła dodać

#include <cpp/nullptr.h> 

aw poleceniu build dostosować zawierać ścieżkę tak, że przez kompilator z nullptr wsparcia, to podnosi pusty nagłówek, a dla starego kompilatora, że ​​brakuje nullptr, to odbiera nagłówek, który definiuje go à la Meyers (na przykład).

A następnie sprawdź bardzo dokładnie!

Nazywam ogólną koncepcję posiadania wielu wersji nagłówka, z jednym wybranym przez polecenie budowania, wirtualny nagłówek. Można zbudować wokół niej wiele maszyn, w tym konwencje, które mają sens tylko w bardziej ogólnym przypadku. Na szczęście nie jest to konieczne w tym konkretnym przypadku, ale być może warto o tym pamiętać.

Podsumowując: tworzenie kodu źródłowego C++ sprawia, że ​​magicznie nie ma na czym poprzestać. Dodanie odrobiny pomocy na poziomie kompilacji wydaje się słuszne. :-)

+1

"AFAIK, którego nie można zautomatyzować za pomocą kodu wykrywającego obsługę nullptr" przynajmniej nie w sposób obejmujący niezgodne kompilatory, które w praktyce są w przybliżeniu wszystkie z nich. Na zgodnych kompilatorach możesz, ponieważ kompilator C++ 03 gwarantuje, że nie będzie obsługiwał 'nullptr' jako słowa kluczowego, podczas gdy kompilator C++ 11 będzie go miał. Wszystko, co musisz zrobić, to sprawdzić, które. –

+0

@Steve: tak. :-) on on –

Powiązane problemy