Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Полуподходит. В Стандарте C++ английским по белому (правда,... 05.03.05 16:52 Число просмотров: 3192
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 05.03.05 17:05 Количество правок: 13
|
> > стандарту C++, не C - но я подозреваю, что и последнему > > тоже). Стандарт явным образом прописывает, что NULL должен > > быть целой константой и определение как (void *)0 НЕ подходит. > Вообще то подходит. Полуподходит. В Стандарте C++ английским по белому (правда, в сноске) написано, что (void *)0 не относится к допускаемым Стандартом реализациям NULL (если тебе интересно, это начало раздела 18). В Стандарте C такой сноски нет. А вообще я слабо понимаю, чем не задался (void *)0 .
> Литеральный 0 преобразованный к > указателю на любой тип является NULL-pointer-ом, хотя его > двоичное представление может отличаться от представления > самого нуля (но это уже проблемы компилятора). > Следовательно ((void *)0) всегда будет иметь значение NULL. С этим не спорю.
> С другой стороны NULL - > не является ключевым словом ни в C ни в C++ следовательно > его можно засунуть только в библиотеку. В C из двух > вариантов переменная или макрос совершенно резонно был > выбран макрос. В C++ появляется еще третий вариант - > константная переменная, которая хоть и занимает место в > секции констант, но все равно обращения к ней будут > соптимизированы в тот же вид, что и с макросом. Оставлен > макрос - ну и фиг с ним. В Комитете по Стандарту С++ сейчас пылится заявка товарища Саттера о введении в язык величины nullptr и типа nullptr_t.
> А никто и не собирался сравнивать с указателем ;-P. > Выбирался более правильный из двух вариантов > (!ptr) и (ptr == NULL) Если NULL — это (void *)0 , то ptr == NULL — это как раз сравнение с указателем :)
> Лично мне больше нравится второй вариант, как более явно > показывающий что я делаю. До вчерашнего дня я считал его > еще и более соответствующим стандарту Вообще говоря, явно указанных сущностей в случае (!ptr) меньше, поэтому мест, где (теоретически) может сломаться, тоже меньше :) Я понимаю, что это дохлый аргумент, поэтому выбираю (!ptr) в силу лаконичности без ущерба для ясности. На самом деле обе проверки одинаково ясно показывают, что делается, а !ptr в случае C++ ещё и более гибко, поскольку для «умного» указателя позволяет не писать operator== с чем-нибудь неприличным в аргументе. Вместо этого можно написать operator bool(), который, правда, тоже можно использовать не по назначению, увы.
> > P.S. Несмотря на то, что NULL, по стандарту - целое число, > > производители компиляторов всё же стараются, чтобы длина > > NULL равнялась длине указателя. Это позволяет спокойно > > использовать NULL (в отличие от 0), для указания конца > > переменного списка аргументов (в "функциях с > > многоточиями"). > Дык ты ж сам указываешь тип следующей переменной. Хоть 0, > хоть NULL хоть вообще структура. И все это может быть > маркером конца :-) Виноват, не договорил :) Для указания конца переменного списка аргументов, состоящего из однотипных указателей. :)
|
|
|