Vou começar com isso: a consistência é o rei, a decisão é menos importante do que a consistência em sua base de código.
Em C ++
NULL é definido como 0 ou 0L em C ++.
Se você leu A linguagem de programação C ++ que Bjarne Stroustrup sugere usar 0
explicitamente para evitar a NULL
macro ao realizar tarefas , não tenho certeza se ele fez o mesmo com as comparações, já faz um tempo desde que li o livro, acho que ele fez if(some_ptr)
sem uma comparação explícita, mas sou confuso nisso.
A razão para isso é que a NULL
macro é enganosa (como quase todas as macros). Na verdade 0
, é literal, não um tipo exclusivo, como o nome sugere. Evitar macros é uma das diretrizes gerais em C ++. Por outro lado, 0
parece um número inteiro e não é quando comparado ou atribuído a ponteiros. Pessoalmente, eu poderia ir de qualquer maneira, mas normalmente pulo a comparação explícita (embora algumas pessoas não gostem disso, provavelmente é por isso que você tem um colaborador sugerindo uma alteração).
Independentemente dos sentimentos pessoais, essa é basicamente uma escolha do menos mau, pois não existe um método correto.
Isso é claro e é um idioma comum e eu prefiro, não há chance de atribuir um valor acidentalmente durante a comparação e ele lê claramente:
if(some_ptr){;}
Isso fica claro se você souber que some_ptr
é um tipo de ponteiro, mas também pode parecer uma comparação inteira:
if(some_ptr != 0){;}
Isso é claro, em casos comuns, faz sentido ... Mas é uma abstração com vazamento, NULL
na verdade é 0
literal e pode acabar sendo mal utilizada facilmente:
if(some_ptr != NULL){;}
O C ++ 0x possui nullptr, que agora é o método preferido, pois é explícito e preciso, mas tenha cuidado com a atribuição acidental:
if(some_ptr != nullptr){;}
Até que você possa migrar para o C ++ 0x, eu diria que é uma perda de tempo se preocupar com qual desses métodos você usa, todos eles são insuficientes e é por isso que o nullptr foi inventado (junto com problemas genéricos de programação que surgiram com o encaminhamento perfeito .) O mais importante é manter a consistência.
Em C
C é um animal diferente.
Em C NULL pode ser definido como 0 ou como ((vazio *) 0), C99 permite constantes de ponteiro nulo definidas de implementação. Portanto, na verdade, tudo se resume à definição de NULL da implementação e você terá que inspecioná-la na sua biblioteca padrão.
As macros são muito comuns e, em geral, são muito usadas para compensar deficiências no suporte genérico à programação na linguagem e em outras coisas. A linguagem é muito mais simples e a dependência do pré-processador é mais comum.
Nessa perspectiva, eu provavelmente recomendaria o uso da NULL
definição de macro em C.