С++ nil vs NULL

ОК, у меня есть код С++ в заголовке, который объявлен следующим образом:

void StreamOut(FxStream *stream,const FxChar *name = nil);

и я получаю: error:

'nil' was not declared in this scope

Нет, это паскаль, правильно?

Должен ли я использовать NULL?

Я думал, что они оба одинаковые или, по крайней мере, Zero, нет?

Ответ 1

В С++ вам нужно использовать NULL, 0 или в некоторых новых компиляторах nullptr. Использование NULL против 0 может быть немного дискуссией в некоторых кругах, но IMHO, NULL является более популярным использованием более 0.

Ответ 2

nil не существует в стандартном С++. Вместо этого используйте NULL.

Ответ 3

Да. Он NULL в C и C++, а nil - в Objective-C.

Каждый язык имеет свой собственный идентификатор без объекта. В C стандартная библиотека NULL является typedef ((void *)0). В C++ стандартная библиотека NULL является typedef из 0 или 0L.

Однако IMHO, вы никогда не должны использовать 0 вместо NULL, так как он помогает читабельности кода, точно так же, как наличие постоянных переменных в вашем коде: без использования NULL значение 0 также используется для нулевых указателей в качестве значения базового индекса в циклах, а также для подсчета/размеров для пустых списков, становится труднее узнать, какой из них является. Кроме того, для grep проще и т.д.

Ответ 4

0 является рекомендуемым и распространенным стилем для С++

Ответ 5

Если вы запустите поиск через glibc, вы найдете эту строку кода:

#define NULL 0

Это просто стандартный способ (не уверен, был ли он опубликован в любом месте) маркировки пустых указателей. Значение переменной 0 остается значением. Указатель, указывающий на 0 (0x0000... (его десятичный ноль)), фактически нигде не указывается. Это просто для удобства чтения.

int *var1, var2;
var1 = 0;
var2 = 0;

Вышеуказанные два назначения не совпадают, хотя оба они выглядят одинаково

Ответ 6

просто добавьте в начале

#define null '\0'

или что угодно, а не null и придерживайтесь того, что вы предпочитаете. Концепция null в С++ связана только с указателем, указывающим на ничего (0x0)..

Учтите, что каждый компилятор может иметь собственное определение null, nil, NULL, что угодно.. но в конце он все равно 0.

Вероятно, в источнике, на который вы смотрите, есть

#define nil '\0'

где-то в файле заголовка.

Ответ 7

Я видел несколько комментариев о том, почему не использовать 0. Как правило, людям не нравятся магические числа или номера со значением позади них. Дайте им имя. Я бы предпочел видеть ANSWER_TO_THE_ULTIMATE_QUESTION более 42 в коде.

Как и для nil, я знаю Obj-C, используя nil. Мне не хотелось бы думать, что кто-то пошел против очень популярного соглашения (или, по крайней мере, того, что я помню) из NULL, которое, как я думал, было где-то в стандартном библиотечном заголовке. Я еще не сделал С++, хотя.