Я начну с этого: согласованность важна, решение менее важно, чем согласованность в вашей кодовой базе.
В C ++
NULL определяется как 0 или 0L в C ++.
Если вы читали язык программирования C ++, Бьярн Страуструп предлагает 0
явно использовать NULL
макрос, чтобы избежать макроса при выполнении присваивания , я не уверен, что он делал то же самое со сравнениями, я давно читал книгу, думаю, он просто сделал if(some_ptr)
без явного сравнения, но я не уверен в этом.
Причина этого в том, что NULL
макрос обманчив (как почти все макросы), на самом деле он 0
буквальный, а не уникальный тип, как следует из названия. Избегание макросов является одним из общих указаний в C ++. С другой стороны, 0
выглядит как целое число, а не по сравнению с или присвоено указателям. Лично я мог бы пойти любым путем, но обычно я пропускаю явное сравнение (хотя некоторым людям это не нравится, поэтому, вероятно, у вас есть участник, предлагающий изменение в любом случае).
Независимо от личных чувств, это во многом выбор наименьшего зла, поскольку не существует единственного правильного метода.
Это ясная и распространенная идиома, и я предпочитаю, что нет случайного присваивания значения во время сравнения, и он ясно показывает:
if(some_ptr){;}
Это понятно, если вы знаете, что some_ptr
это тип указателя, но это также может выглядеть как целочисленное сравнение:
if(some_ptr != 0){;}
Это понятно, в общих случаях это имеет смысл ... Но это утечка абстракции, NULL
на самом деле 0
буквальная и может в итоге легко использоваться неправильно:
if(some_ptr != NULL){;}
C ++ 0x имеет nullptr, который теперь является предпочтительным методом, поскольку он явный и точный, просто будьте осторожны с случайным присваиванием:
if(some_ptr != nullptr){;}
До тех пор, пока вы не сможете перейти на C ++ 0x, я буду утверждать, что бесполезно беспокоиться о том, какие из этих методов вы используете, их все недостаточно, поэтому был изобретен nullptr (наряду с общими проблемами программирования, которые привели к идеальной пересылке). .) Самое главное, чтобы сохранить последовательность.
В С
С другой зверь.
В C NULL может быть определено как 0 или как ((void *) 0), C99 допускает реализацию определенных констант нулевого указателя. Так что на самом деле все сводится к определению реализации NULL, и вам придется проверить его в стандартной библиотеке.
Макросы очень распространены, и в целом они часто используются, чтобы восполнить недостатки в общей поддержке программирования на языке и других вещах. Язык намного проще и более распространена зависимость от препроцессора.
С этой точки зрения, вероятно, я бы рекомендовал использовать NULL
определение макроса в C.