2010-08-26 13 views
22

Powiel możliwe:
Do you use NULL or 0 (zero) for pointers in C++?Korzystanie z NULL w C++?

Czy to dobry pomysł, aby używać NULL w C++ lub po prostu wartość 0?

Czy istnieje specjalna okoliczność korzystania NULL w kodzie C dzwonisz z C++? Jak SDL?

+0

Zauważ, że 'NULL == 0' jest tylko konwencją. Wartość NULL można zdefiniować z inną wartością, chociaż byłaby to rzadka sytuacja. –

+0

Powiedziałabym to na odwrót - jeśli odwołujesz się semantycznie do nieprawidłowego wskaźnika, dlaczego * nie używałbyś * NULL, co jest właśnie tym? –

+2

Z pewnością jest to duplikat pytania. –

Odpowiedz

25

W C++ NULL rozszerza się do 0 lub 0L. Zobacz ten komentarz od Stroustrup:

Czy powinienem używać wartości NULL lub 0? W C++ definicja NULL wynosi 0, więc istnieje tylko różnica estetyczna. Wolę , aby uniknąć makr, więc używam 0. Kolejny problem z NULL to , ponieważ ludzie czasami mylnie wierzą, że to różni się od 0 i/lub nie jest liczbą całkowitą . W standardowym kodzie wartość NULL była/jest czasami definiowana jako coś, co nie jest odpowiednie dla i dlatego powinno być/musi być unikane. To mniej powszechne niż te dni.

Jeśli trzeba wymienić zerowy wskaźnik, nazwać nullptr; tak to będzie wywoływane w C++ 0x. Wówczas słowo kluczowe będzie oznaczać "nullptr" jako .

+1

Myślę, że muszę się nie zgodzić ze Stroustrupem w ostatniej chwili. Unikałbym używania nullptr w systemach, w których nie został on jeszcze zaimplementowany z dokładnie tego powodu, że będzie później. Zachowanie słowa kluczowego nullptr nie może być replikowane z integralną definicją. Nie sądzę, żeby to mogło być w ogóle replikowane. Możesz napotkać sytuacje, w których twój kod robi jedną rzecz jednego dnia, a potem następny, po aktualizacji kompilatora, coś zupełnie innego. Zasadniczo wszystko, co ma dotyczyć słowa kluczowego "nullptr", ulegnie zmianie. –

+1

Dzięki, stary! To naprawdę pomogło. Czy #define nullptr 0 byłaby przydatna? – Jookia

+0

@Jookia: Nie! Nie używaj '#define nullptr 0' w kodzie, czytaj komentarz Noah Roberts powyżej. Jeśli to zrobisz, po uaktualnieniu do kompilatora zgodnego ze standardem C++ 0x Twój kod może się nie skompilować (co byłoby dobre) lub zrobić dziwne rzeczy. – Praetorian

2

Od crtdbg.h (i wiele innych nagłówków):

#ifndef NULL 
#ifdef __cplusplus 
#define NULL 0 
#else 
#define NULL ((void *)0) 
#endif 
#endif 

Dlatego NULL jest 0, przynajmniej na platformie Windows. Więc nie, nie o tym wiem.

1

Nigdy nie używam NULL w moim C lub C++ kodu. 0 działa dobrze, podobnie jak if (ptrname). Każdy kompetentny programista C lub C++ powinien wiedzieć, co robi.

+0

Ponieważ rzadko używam wskaźników (wszystkie są w inteligentnych wskaźnikach), nie ma to większego znaczenia. –

+0

Teraz, gdy C++ 11 jest najnowszym, powszechnie używanym standardem, podejrzewam, że przełączyłeś się również na 'nullptr'. – peterh

+0

@peterh - Yup. To był naprawdę wczesny (6-latkowy) posterunek. W tych dniach spieszę się również, aby podkreślić, że powinieneś także starać się unikać używania wskaźników (podobnie jak komentarz Lokiego, ale staraj się nie potrzebować nawet "inteligentnych"). Nowa semantyka ruchu znacznie ułatwia to zadanie. –

10

Wadą NULL w C++ jest to, że jest zdefiniowany dla 0. Jest to wartość, która może być cicho konwertowana na wskaźnik, wartość bool, float/double lub int.

To nie jest bardzo bezpieczny rodzaj i prowadzą do faktycznych błędów w aplikacji pracowałem dalej.

Rozważ to:

void Foo(int i); 
void Foo(Bar* b); 
void Foo(bool b); 


main() 
{ 
    Foo(0);   
    Foo(NULL); // same as Foo(0) 
} 

C++ 11 definiuje nullptr że jest zamienny z zerowym wskaźnikiem, ale nie do innych skalarów. Jest to obsługiwane we wszystkich współczesnych kompilatorach C++, w tym w VC++ od 2008 roku. W starszych wersjach GCC istnieje podobna funkcja, ale później została ona nazwana __null.

0

Zakładając, że nie masz nagłówek biblioteki lub system, który definiuje NULL jak na przykład (void*)0(char*)0 czy to jest w porządku. Zawsze używam 0, ponieważ jest to z definicji wskaźnik zerowy. W C++ 0x będziesz miał dostępną nullptr, więc pytanie nie będzie już tak ważne.