Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > NULL или 0? |
Автор: Hukuma 6.11.2009, 14:00 | ||||
Здравствуйте! Я не писал на С, начал сразу учить С++. Встал вопрос о том, что правильнее - присваивать указателю NULL или 0, когда он больше не нужен. Я знаю, что в С++ рекомендуется использовать 0, но более опытные коллеги ратуют за NULL. Отсюда вопрос - если сейчас привыкнуть 0, то не будет ли проблем при написании программ на компиляторе С? И есть ли такие компиляторы С++, которые считаю, что
и
разные вещи? |
Автор: Anikmar 6.11.2009, 14:04 |
Надо писать NULL. |
Автор: Hukuma 6.11.2009, 14:06 |
Anikmar, вы знаете из личного опыта? Я не прошу доказательств или убеждений, мне просто интересен вопрос переносимости кода, содержащего присваивание указателя на 0 на компилятор С. |
Автор: Hukuma 6.11.2009, 14:12 |
azesmcar, спасибо большое! Вы правы, первый пример намного нагляднее. Видимо лучше сразу приучусь к NULL ![]() Добавлено через 9 минут и 37 секунд azesmcar, я с вами согласен, что это неправильно переносить код с С++ на С, вопрос скорее более гипотетический, чем практический, мои коллеги пишут так, а я иначе, хочется добиться единообразия в этом, но при том, чтобы было правильно ![]() |
Автор: Любитель 6.11.2009, 23:47 |
В С++ - лучше пока 0 ИМХО. NULL - это макрос, ради которого (в отдельных случаях) ещё придётся и лишний инклюд ставить.. А style mix - это точно зло. Вроде обещали в next-стандарте добавить ключевое слово nullptr. Не знаю, как там сейчас дела обстоят.. |
Автор: Anikmar 7.11.2009, 00:07 | ||
Каждый имеет право на свое лево. 0 - это int, а NULL - обозначение нулевого указателя. ИМХО в С++ я использую NULL - понятнее и логичнее. ИМХО |
Автор: zkv 7.11.2009, 00:23 |
Любитель, а как насчет null в новом стандарте (в контексте массового перевода программ в новый синтаксис), или как его будут обзывать, не суть? По теме. Называй как хочешь, часто описывается в стандарте твоей компании. Для себя предпочитаю употреблять NULL, только для того, чтобы визуально легче было, в коде, отличать инициализацию указателя. |
Автор: Любитель 7.11.2009, 01:15 | ||||
Ээ.. это ваше мнение. 0 - это не int ![]() Добавлено через 17 секунд
Не понял вопроса. |
Автор: Anikmar 7.11.2009, 01:31 |
Согласен, что 0 не совсем int, но давайте рассмотрим стандартные преобразования. Когда 0 - это не int без принудительного преобраззования? |
Автор: andrew_121 7.11.2009, 01:35 | ||
Еще нет :( Добавлено через 3 минуты и 42 секунды Любитель, Anikmar, По сути, мало кто вникает в детали NULL и 0. azesmcar Процитировал все что должен знать каждый С++ прогер. Сам использую NULL для указателей, и 0 для целых. |
Автор: Anikmar 7.11.2009, 01:44 |
Просветите меня в те детали, в которые я не вник, пожалуйста... |
Автор: zkv 7.11.2009, 01:47 |
Любитель, по контексту обсуждения похоже, ключевое слово называется . Множество исходников на сегодняшний день написано как со словом NULL вместо нулевого указателя на, так и с 0 вместо него. Первый понятно как перебить - достаточно замены макроопределения в проекте, а как быть со вторым? (в этом состоял мой вопрос) |
Автор: Любитель 7.11.2009, 02:08 |
Если честно - не знаю, надо читать. Но решения с первым - костыль. Причём (объективно) ужасный. Быть может будет работать и 0, но вот nullptr в контексте числа нельзя будет использовать. А быть может вообще на это предложение забили ![]() Добавлено через 2 минуты и 27 секунд Блин, когда используется в контексте любого указателя. Без explicit-кастинга. Конкретные линки на стандарт, думаю, не нужны? ![]() [полуоффтоп] Кстати, кутешный кодестайл не рекомендует использовать NULL ![]() [/полуоффтоп] |
Автор: Anikmar 7.11.2009, 02:28 | ||
Если честно, уже сам сомневаюсь, но цифра 0 вроде всегда считалась int, а потом приводилась к типу void * . Если 0 используется в контексте указателя разве там не идет преобразование int->void* ? |
Автор: zkv 7.11.2009, 02:33 |
ой, мозоль уже набили, да накакать на троллей, как и на гугл, как и на мотороллу, если они неправы. Не верьте никому, выбирайте правильные ориентиры. Я никогда не признаю моторолловские "не используйте пространства имен", гугловские и троллтечные регистры имен файлов, когда дело касается имен классов в них содержащихся, про исключения вообще молчу. |
Автор: mes 7.11.2009, 11:39 | ||||||
а "1 " должен соблюдат
это Вы про C++ ? тогда 1. Чем в таком случае "1" отличается от "0" ? 2. Почему (в Cpp) не работает конструкция : int * i = (int)(void*) 1; ![]() Добавлено через 4 минуты и 24 секунды
![]() всегда надо обдумывать почему введено то и другое правило ? Зачастую эти ограничения приводят к некоторой ущербности, но делают это для того, чтоб так называемо "облегчить" жизнь программисту. имхо, одна из причин, чтоб не было проблем со стыковкой с неграмотно написанным кодом, как например в случае с констанстностью. Проще ведь запретить использовать, чем научить использовать правильно ![]() ![]() |
Автор: Любитель 7.11.2009, 11:47 | ||||
Ну.. что значит преобразование. Если 0 используется в контексте любого указателя плюсовый компилятор обязан его интерпретировать как нулевой указатель нужного типа.
Ну, я ж написал, что "полуофтоп". Вроде и по теме - но никому ничего этим доказать я само собой не собирался (ибо да, я понимаю, по большому счёту это не аргумент). Лично моё предпочтение к 0 вместо NULL обуславливается двумя причинам: 1. Субъективная: меня раздражают идентификаторы в стиле ALL_IN_UPPER_CASE ![]() 2. Объективная (хотя и не столь уж важная): если у нас есть хидер класса, которому (с точки зрения простой логики) не нужны никакие инклюды, мы хотим указать значение по умолчанию в качестве нулевого указателя в каком-либо методе, то.. Для NULL придётся добавить инклюд на cstddef/stddef.h. Добавлено через 1 минуту и 29 секунд mes, перечитал два раза твой пост - и так не понял, на какой ты "стороне"? ![]() |
Автор: MAKCim 7.11.2009, 11:56 | ||||
таки int ;)
2, 4, 8 на моем core2duo, x86_64, gcc 4.3.2 Добавлено через 4 минуты и 54 секунды
возможно это в стандарте, но это + к списку граблей с т. з. грамматики языка и к тому же нелогично 0 - это целое число, а множество значений адресов, формально говоря, не является надмножеством целых чисел ;) |
Автор: Любитель 7.11.2009, 12:37 | ||
0 - это нечто страшное ![]()
Да, это косяк стандарта, на мой взгляд. Именно потому было предложение про nullptr. Текущие решения ИМХО оба костыльны. Впрочем, целые числа и логический тип (по идее) тоже не должны пересекаться - в С++ здесь лучше (чем в С - впрочем для С это как раз не минус, ибо другой уровень, другое мышление), новполне возможен неявный кастинг.. Да-да, полтора года работы на шарпе дают о себе знать... |
Автор: MAKCim 7.11.2009, 13:07 |
в обычном (ansi) C bool'а нет, так что что там будет пдразумеваться под bool зависит от программиста ;) |
Автор: Любитель 7.11.2009, 13:17 |
Да, я знаю. И это плохо ![]() В С++ же он есть - и это хорошо. Но неявный кастинг из чисел - это плохо ![]() |
Автор: MAKCim 7.11.2009, 13:26 |
ничего не каститься, возвращается int а вот семантика if (...) и аналогов использует значения 0 и не 0 и это абсолютно независимые вещи ;) а вот в C++ идет как раз каст в bool |
Автор: Любитель 7.11.2009, 13:31 |
Ээ.. ну я и говорю про С++. Это речь про С. Про С++. "Но" к последней фразе. Тоже про С++. Сорри, если неясно выразился ![]() |