разница между if (указатель) и if (указатель! = NULL) в C ++, проблема cpplint

Я уже проверил этот пост Могу ли я использовать if (указатель) вместо if (указатель! = NULL)? и некоторые другие посты в сети.

Но это не говорит о разнице между двумя утверждениями.

Проблема: Когда я запустил cpplint.py в своем коде cpp, я обнаружил проблемы, когда я проверял указатели на NULL.
Я предпочел проверить с помощью простого

if(pointer)         //statement1

но cpplint говорит, что вы должны проверить, как

if(pointer != NULL)        //statement2

Так что я просто хочу знать, есть ли какие-либо преимущества оператор2 над statement1 ? Существуют ли сценарии, в которых statement1 может создать проблему?

За работой: Насколько мне известно, есть нет разницы в работе обоих утверждений. Это просто изменение стиля кодирования.

Я предпочитаю использовать как statement1, так как

  • Это просто, читабельно
  • Нет напряжения отсутствует (=) по ошибке над равенством (==) в сравнении

Но cpplint поднимает эту проблему как проблему, тогда я мог бы упустить некоторую выгоду.

Замечания: Java также не поддерживает statement1.

9

Решение

Нет, если pointer на самом деле это тип указателя, нет никакой разницы, поэтому здесь все вопрос стиля кодирования. Стиль кодирования, в свою очередь, зависит от привычек в разных сообществах, поэтому не может быть общей рекомендации.

Я лично предпочитаю первое, потому что оно короче и более точно и избегает использования фиктивного макроса NULL,

В С NULL это могут быть разные вещи (целое число или указатель), а в C ++ его использование даже не рекомендуется в настоящее время. Вы должны хотя бы использовать nullptr, там.

6

Другие решения

Вы используете венгерскую нотацию, где можно определить, является ли переменная указателем. Пока это — родной или умный — нет никакой разницы. Тем не менее, когда кто-то меняет его на другой косвенный тип (например, std::optional<>), то второй не удастся. Поэтому я предлагаю продолжать использовать первое: это не Java, а C ++.

3

В C ++, предполагая ptr это указатель, сравнения if (ptr) а также if (ptr != NULL) функционально эквивалентны.

В C ++ 11 и более поздних версиях часто считается предпочтительным использовать альтернативные if (ptr != nullptr),

Для простой проверки указателя различия в этих параметрах действительно стилистические. Механизмы могут немного отличаться, но конечный результат тот же.

Как и большинство автоматических контролеров, cpplint, по умолчанию, чаще жалуется на нарушения одних правил стиля, чем другие. Будет ли какой-то конкретный набор правил правильным или неправильным, зависит от того, что нужно для вашего проекта.

Для типов классов, которые можно разумно сравнить с указателем (например, типы интеллектуальных указателей), предпочтительный тест зависит от того, какой набор операций (операторы сравнения, неявные преобразования и т. Д.) Поддерживает этот тип.

2

В C, посмотри:

int *ptr=malloc(10*sizeof *ptr);
free(ptr); // though the memory is freed, the ptr is not auto-set to NULL
if (ptr)
{
printf ("ptr is not null\n");
}

Так что вы должны поставить

ptr=NULL; // ptr is explicitly made to point at nothing
// The above step is mandatory.

после free,

Так как ответ в if-statementможно порекомендовать сделать

if ( ptr == NULL ) // This is mostly a coding style & improves readability?

или лучше

if ( NULL == ptr ) // less chances of error

Ну, то [сайт] говорит о cpplintчто это :

Автоматическая проверка, чтобы убедиться, что файл C ++ следует Стиль Google C ++ руководство

Итак, еще раз, это чей-то стиль, который имеет значение. Скажем, если вы внесете свой вклад в чей-то код в Google, они ожидают, что вы будете следовать этому стилю, который облегчает совместную работу.

1

Нет разницы между if (указатель) и если (указатель! = NULL). if (указатель) используется для оптимизации кода.

-1