Diciamo che ho una funzione C ++ simile a questa:
bool Foo(Bar* b)
{
if(b == nullptr) {
return false;
}
// Do stuff
return true;
}
Diciamo inoltre che, a causa delle limitazioni con alcuni degli strumenti che non supportano nessuno standard più recente di C ++ 03, ho questo codice in un'intestazione:
#if __cplusplus <= 199711L
#define nullptr (0)
#include <stdint.h>
#else
#include <cstdint>
#endif // End if C++03
Il mio compilatore lo costruirà senza avvertimenti o errori. So che non ho per lanciare nullptr
ma c'è una ragione convincente che io dovrebbe farlo? Cioè, c'è il potenziale per alcuni bug di insinuarsi in relazione a Foo()
che usando if (b == static_cast<Bar*>(nullptr))
avrebbe evitato e che il compilatore non mi avrebbe avvertito riguardo (in entrambi i C + +03 o C ++ 11 o successivo)?
Le mie ragioni per evitare il cast sarebbero:
- L'aggiunta del cast a ogni utilizzo di
nullptr
sembra che renderebbe il codice più disordinato / più difficile da leggere. - Non ho visto molto (se esiste) il codice che lo fa.
Il numero 2 non è un buon motivo in sé e per sé, quindi mi chiedo se è fatto perché è più conveniente per l'autore del codice e / o se è perché non c'è davvero una ragione convincente per farlo.
Modifica in base alla risposta proposta: Le domande sono:
- Se sono bloccato con C ++ 03 ora, ma voglio ancora pianificare il C ++ 11 in futuro, è la migliore opzione per restare con il% co_de legacy impostato su un valore intero e tutto il meglio- pratiche che vengono con esso?
- Se sono bloccato con qualcosa della varietà
NULL
, dovrei sempre applicare un cast? Ad esempio:#define NULL (0)
non è qualcosa che vedo fatto molto e mi chiedo se questo è per pigrizia o se ci sono buone ragioni per farlo o non farlo nel caso di confronti (come i controlli dei puntatori nulli esemplificati sopra) .