Может ли использование 0L для инициализации указателя в C ++ вызвать проблемы? - PullRequest
2 голосов
/ 15 декабря 2009

В этот вопрос инициализатор используется для установки указателя на ноль. Вместо использования значения 0 используется значение 0L. Я читал, что нужно использовать ровно 0 для нулевых указателей, потому что точное представление нулевого указателя зависит от реализации.

Может ли использование 0L установить нулевой указатель вызвать проблемы при портировании?

Ответы [ 9 ]

16 голосов
/ 15 декабря 2009

Из стандарта (4.10.1):

Константа нулевого указателя является интегралом константное выражение (5.19) целочисленный тип с нулевым значением

так что я думаю 0L в порядке.

13 голосов
/ 15 декабря 2009

Я думаю, что 0L хорошо, за исключением того, что это будет означать, что вы полагаете, что тип указателя, которому вы назначаете, имеет тот же размер, что и long, и поэтому немного сбивает с толку.

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

4 голосов
/ 15 декабря 2009

В C ++ 0x есть новая константа нулевого указателя с именем nullptr типа nullptr_t. Он может быть неявно преобразован в любой тип указателя.

До тех пор я бы рекомендовал использовать NULL, однако 0 и 0L будут работать для каждой реализации, о которой я когда-либо слышал.

3 голосов
/ 15 декабря 2009

Я не могу дать вам точный ответ, но независимо от того, каков точный ответ на ваш вопрос, сама идея инициализации указателя с 0L неверна, потому что предполагает, что указатель имеет тот же размер как long, что не обязательно верно, конечно.

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

2 голосов
/ 16 декабря 2009

Вы можете использовать false, 0, 0l, 0L, 0ul, 0u, 00 или любое количество способов представления буквального нуля. Буквальный ноль - это в основном магический символ, который также соответствует константе нулевого указателя.

Если бы мы говорили о значении, которое оказывается поразрядно нулевым, и код записывал его по указателю, то у нас были бы проблемы, упомянутые выше.

Дополнительный вопрос: Какие типы имеют константу нулевого указателя, которая не является побитовым нулем?

2 голосов
/ 15 декабря 2009

Я не согласен с теми, кто рекомендует использовать NULL, хотя любой из трех указанных вариантов действительно будет работать. В идиоматическом C ++ стандартный выбор равен 0 (возможно, потому что это предпочтение Страуструпа: http://www2.research.att.com/~bs/bs_faq2.html#null).

0L будет неявно приведен к соответствующему типу указателя так же, как 0; это выглядит немного странно и не имеет особого смысла по той причине, которую дал Джеспер ..

2 голосов
/ 15 декабря 2009

Представление нулевого указателя зависит от реализации, но ни 0, ни 0L не обязательно являются реализацией - это просто способы, которыми пользователь может указать нулевой указатель, и любой из них в порядке.

Я должен отметить, что Бьярн Страуструп несколько раз указывал, что он предпочитает использовать простой 0 (а не NULL).

1 голос
/ 15 декабря 2009

Я бы согласился со всеми, кто сказал NULL. Тем, кто предпочитает использовать 0, я считаю, что ваш код должен сказать, что это значит. Результатом, который вы хотите, является нулевой указатель, поэтому ваш код должен сказать это. Это имеет еще больше смысла, когда вы делаете сравнение:

if (some_variable == NULL) { ... }

намного яснее, чем

if (some_variable == 0) { ... }
0 голосов
/ 15 декабря 2009

Присвоение 0L, длинного целого (64-битного) 32-битному указателю может вызвать проблемы. Как и в другом упомянутом посте, используйте NULL для инициализации указателей на ноль.

...