Russian Qt Forum

Программирование => С/C++ => Тема начата: Hort от Июль 16, 2008, 02:27



Название: NULL vs 0
Отправлено: Hort от Июль 16, 2008, 02:27
Что правильнее: использовать 0 или NULL в С++?


Название: Re: как отсоединить модель от представления
Отправлено: Пантер от Июль 16, 2008, 11:14
Кажись правильнее в С++ 0.


Название: Re: как отсоединить модель от представления
Отправлено: Dodge от Июль 16, 2008, 11:17
Правельнее использовать макрос NULL


Название: Re: как отсоединить модель от представления
Отправлено: Sergey B. от Июль 16, 2008, 11:28
В C++ не рекомендуется использовать макросы.


Название: Re: как отсоединить модель от представления
Отправлено: Dodge от Июль 16, 2008, 11:54
В C++ не рекомендуется использовать макросы.
Ну имеется ввиду наверно пользовательские макросы... как же быть без __LINE__, __FILE__, __PRETTY__FUNCTION__ ? ;D

З.Ы. Это рекомендация из нового стандарта?


Название: Re: как отсоединить модель от представления
Отправлено: ритт от Июль 16, 2008, 11:59
__LINE__, __FILE__, ... - это макросы компилятора (не по теме)
в плюсах общераспространено использование костант...хотя, и макросы никто не запрещал.
лично я использую константы, т.к. в этом есть некоторое преимущество над макросами


Название: Re: как отсоединить модель от представления
Отправлено: Dodge от Июль 16, 2008, 12:24
__LINE__, __FILE__, ... - это макросы компилятора (не по теме)
ну если уж давится подробностями ( ;D), то это макросы препроцессора... дело не в этом.
Разговор идет об использовании макроса NULL, который по сути является внутренним макросом и как я понимаю существующим на уровне стандарта.

Собственно вопрос был про рекомендация, он и остался.


Название: Re: как отсоединить модель от представления
Отправлено: pastor от Июль 16, 2008, 13:03
Правельнее использовать макрос NULL, но троли почемуто повсемесно используют именно 0, по этому сложно сказать что правельнее в приложения с исп. qt...

Стандарт С++ глосит следующее:

Цитировать
18.1. 4 The macro NULL is an implementation-defined C++ null pointer constant in this International Standard. Possible definitions include 0 and 0L, but not (void*)0.

т.е. согласно стандарту NULL == 0. Но NULL в зависимости от реализации не обязан быть именно 0. Это зависит от фантазии разработчиков компилятора. Лично мне не известно ни одной реализации, где NULL был бы отличен от 0, но это не означает, что таких реализаций не может быть вообще. Поэтому программистам С++ рекомендуют использовать 0 вместо NULL.

Страуструп жестко относится к использованию макроса NULL в программах:

Цитировать
5.1.1. Ноль.
...
В языке С было очень популярно определять макрос NULL для представления такого нулевого указателя. Так как в C++ типы проверяются более жестко, использование банального нуля вместо NULL приведет к меньшим проблемам. Если вы чувствуете, что просто обязаны определить NULL, воспользуйтесь
const int NULL = 0;


Название: Re: как отсоединить модель от представления
Отправлено: ритт от Июль 16, 2008, 13:21
во, хочу добавить ещё про нулл :)
все ведь читали на башорге про
> #define TRUE false
> #define FALSE true // счастливого дебага
?

нулл был изначально задуман чтобы стать популярным и потом делать такие пакости :)


Название: Re: NULL vs 0
Отправлено: Red Devil от Июль 16, 2008, 15:57
Использовать "0", кроме всего лучше еще по 2 причинам :
1) Его очень просто написать (нужно нажать всего лишь одну кнопку), т.е. помощь программисту который пишет код
2) Он читается проще и быстрее, помощь программисту читаюшему код.

Мне этот макрос всегда не нравился, но приучили на учебе, но после того как прочитал Страуструпа окончательно отказался от него.


Название: Re: NULL vs 0
Отправлено: Tonal от Июль 16, 2008, 21:04
В новом стандарте вводят константу null_ptr которая не будет приводится к интегральным типам.
Т.е. конструкции подобные null_ptr != 2 или buf[null_ptr] будут приводить к ошибкам компиляции в отличии от 0 != 2 или buff[NULL]


Название: Re: NULL vs 0
Отправлено: Red Devil от Июль 16, 2008, 22:02
Вообще-то массив нулевой длины и в текущем стандарте нельзя определить и все компиляторы маломальски поддерживающие стандарт генерируют ошибку времени компиляции на int a[0] или int a[NULL].


Название: Re: NULL vs 0
Отправлено: Tonal от Июль 17, 2008, 06:53
Я имел в виду не объявление а выражение:
Код:
char buf[10];
buf[NULL] = 5;
Страуструп возражал против макроса ввиду его полной бессмысленности. Т.к. его невозможно определить так, чтобы компилятор отлавливал подобные ошибки.


Название: Re: NULL vs 0
Отправлено: Red Devil от Июль 17, 2008, 10:59
О_о
я сомневаюсь чтобы кто-нибудь такое мог написать ... профессионал точно не напишет, для новичка это покажется слишком не логичным.


Название: Re: как отсоединить модель от представления
Отправлено: Dodge от Июль 17, 2008, 11:16
во, хочу добавить ещё про нулл :)
все ведь читали на башорге про
> #define TRUE false
> #define FALSE true // счастливого дебага
?

нулл был изначально задуман чтобы стать популярным и потом делать такие пакости :)
Всемирный заговор?  :)

Цитировать
18.1. 4 The macro NULL is an implementation-defined C++ null pointer constant in this International Standard. Possible definitions include 0 and 0L, but not (void*)0.
Собственно это я и хотел ... прочесть  ;D спасибо.


Название: Re: NULL vs 0
Отправлено: vregess от Июль 18, 2008, 08:44
ноль все же лучше


Название: Re: как отсоединить модель от представления
Отправлено: Alex Custov от Август 01, 2008, 15:00
Но NULL в зависимости от реализации не обязан быть именно 0. Это зависит от фантазии разработчиков компилятора.

это зависит от libc, не зря NULL описан в разделе 18 "Language support library".

Лично мне не известно ни одной реализации, где NULL был бы отличен от 0, но это не означает, что таких реализаций не может быть вообще. Поэтому программистам С++ рекомендуют использовать 0 вместо NULL.

Сам NULL тут ни при чём, и скорее всего что он будет именно 0. Тут дело в бинарном представленни нулевого указателя, и компилятор должен отслеживать присвоения типа ptr = 0; и использовать implementation-defind value в качестве бинарного представления нулевого указателя.