информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsПортрет посетителяВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Полуподходит. В Стандарте 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 хоть вообще структура. И все это может быть
> маркером конца :-)
Виноват, не договорил :) Для указания конца переменного списка аргументов, состоящего из однотипных указателей. :)
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach