Действительно ли void * p = 0L? - PullRequest
2 голосов
/ 24 декабря 2010

В этот ответ , sassman инициализирует указатель с помощью:

zend_class_entry* ce = 0L;

Мой вопрос - это допустимо?Я бы сказал, что это не так, чтобы инициализировать переменную с нулевым указателем, нужно использовать неукрашенную (и, возможно, приведенную к void *) 0 константу, или какой-то макрос, который оценивает это, такой как NULL.

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

Целочисленное константное выражение со значением 0 или такое выражение, приведенное к типу void *, называется константой нулевого указателя .

Ответы [ 3 ]

8 голосов
/ 24 декабря 2010

0L является интегральным константным выражением со значением ноль. При использовании в качестве указателя такое константное выражение является константой нулевого указателя. Это именно то, что говорится в предложении, которое вы цитируете (C99 6.3.2.3/3):

Целочисленное константное выражение со значением 0 или такое выражение, приведенное к типу void *, называется константой нулевого указателя.

За этим немедленно следует утверждение, что константа нулевого указателя может быть преобразована в нулевой указатель:

Если константа нулевого указателя преобразуется в тип указателя, результирующий указатель, называемый нулевым указателем, гарантированно сравнивается с неравным указателем на любой объект или функцию.

Почему вы думаете, что 0 не может использоваться как константа нулевого указателя?

2 голосов
/ 24 декабря 2010

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

0 голосов
/ 24 декабря 2010

Вы можете установить все встроенные типы POD в буквальную константу 0 без приведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...