![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Hukuma |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 18.2.2009 Репутация: нет Всего: нет |
Здравствуйте! Я не писал на С, начал сразу учить С++. Встал вопрос о том, что правильнее - присваивать указателю NULL или 0, когда он больше не нужен. Я знаю, что в С++ рекомендуется использовать 0, но более опытные коллеги ратуют за NULL. Отсюда вопрос - если сейчас привыкнуть 0, то не будет ли проблем при написании программ на компиляторе С? И есть ли такие компиляторы С++, которые считаю, что
и
разные вещи? |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Надо писать NULL.
|
|||
|
||||
Hukuma |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 18.2.2009 Репутация: нет Всего: нет |
Anikmar, вы знаете из личного опыта? Я не прошу доказательств или убеждений, мне просто интересен вопрос переносимости кода, содержащего присваивание указателя на 0 на компилятор С.
|
|||
|
||||
azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Hukuma
В C++ это тоже самое что и 0
а вот в C
потому и Я лично предпочитаю называть вещи своими именами, NULL вместо 0, так нагляднее, представь вызов функции
и
в первом случае сразу понятно что третий аргумент указатель. Добавлено через 3 минуты и 40 секунд
я бы не стал так за это переживать, что значит переносимость в данном случае? Переносимость кода с C++ на C? Нафиг такое нужно? Это совершенно разные языки и никакой переносимости между ними нет и быть не может. |
||||||||||
|
|||||||||||
Hukuma |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 18.2.2009 Репутация: нет Всего: нет |
azesmcar, спасибо большое! Вы правы, первый пример намного нагляднее. Видимо лучше сразу приучусь к NULL
![]() Добавлено через 9 минут и 37 секунд azesmcar, я с вами согласен, что это неправильно переносить код с С++ на С, вопрос скорее более гипотетический, чем практический, мои коллеги пишут так, а я иначе, хочется добиться единообразия в этом, но при том, чтобы было правильно ![]() |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
В С++ - лучше пока 0 ИМХО. NULL - это макрос, ради которого (в отдельных случаях) ещё придётся и лишний инклюд ставить.. А style mix - это точно зло.
Вроде обещали в next-стандарте добавить ключевое слово nullptr. Не знаю, как там сейчас дела обстоят.. |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Каждый имеет право на свое лево. 0 - это int, а NULL - обозначение нулевого указателя. ИМХО в С++ я использую NULL - понятнее и логичнее. ИМХО |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
Любитель, а как насчет null в новом стандарте (в контексте массового перевода программ в новый синтаксис), или как его будут обзывать, не суть?
По теме. Называй как хочешь, часто описывается в стандарте твоей компании. Для себя предпочитаю употреблять NULL, только для того, чтобы визуально легче было, в коде, отличать инициализацию указателя. |
|||
|
||||
Любитель |
|
||||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Ээ.. это ваше мнение. 0 - это не int ![]() Добавлено через 17 секунд
Не понял вопроса. |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Еще нет :( Добавлено через 3 минуты и 42 секунды Любитель, Anikmar, По сути, мало кто вникает в детали NULL и 0. azesmcar Процитировал все что должен знать каждый С++ прогер. Сам использую NULL для указателей, и 0 для целых. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
Любитель, по контексту обсуждения похоже, ключевое слово называется .
Множество исходников на сегодняшний день написано как со словом NULL вместо нулевого указателя на, так и с 0 вместо него. Первый понятно как перебить - достаточно замены макроопределения в проекте, а как быть со вторым? (в этом состоял мой вопрос) |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Если честно - не знаю, надо читать. Но решения с первым - костыль. Причём (объективно) ужасный. Быть может будет работать и 0, но вот nullptr в контексте числа нельзя будет использовать. А быть может вообще на это предложение забили
![]() Добавлено через 2 минуты и 27 секунд Блин, когда используется в контексте любого указателя. Без explicit-кастинга. Конкретные линки на стандарт, думаю, не нужны? ![]() [полуоффтоп] Кстати, кутешный кодестайл не рекомендует использовать NULL ![]() [/полуоффтоп] |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Если честно, уже сам сомневаюсь, но цифра 0 вроде всегда считалась int, а потом приводилась к типу void * . Если 0 используется в контексте указателя разве там не идет преобразование int->void* ? |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
ой, мозоль уже набили, да накакать на троллей, как и на гугл, как и на мотороллу, если они неправы. Не верьте никому, выбирайте правильные ориентиры. Я никогда не признаю моторолловские "не используйте пространства имен", гугловские и троллтечные регистры имен файлов, когда дело касается имен классов в них содержащихся, про исключения вообще молчу. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а "1 " должен соблюдат
это Вы про C++ ? тогда 1. Чем в таком случае "1" отличается от "0" ? 2. Почему (в Cpp) не работает конструкция : int * i = (int)(void*) 1; ![]() Добавлено через 4 минуты и 24 секунды
![]() всегда надо обдумывать почему введено то и другое правило ? Зачастую эти ограничения приводят к некоторой ущербности, но делают это для того, чтоб так называемо "облегчить" жизнь программисту. имхо, одна из причин, чтоб не было проблем со стыковкой с неграмотно написанным кодом, как например в случае с констанстностью. Проще ведь запретить использовать, чем научить использовать правильно ![]() ![]() |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Ну.. что значит преобразование. Если 0 используется в контексте любого указателя плюсовый компилятор обязан его интерпретировать как нулевой указатель нужного типа. Ну, я ж написал, что "полуофтоп". Вроде и по теме - но никому ничего этим доказать я само собой не собирался (ибо да, я понимаю, по большому счёту это не аргумент). Лично моё предпочтение к 0 вместо NULL обуславливается двумя причинам: 1. Субъективная: меня раздражают идентификаторы в стиле ALL_IN_UPPER_CASE ![]() 2. Объективная (хотя и не столь уж важная): если у нас есть хидер класса, которому (с точки зрения простой логики) не нужны никакие инклюды, мы хотим указать значение по умолчанию в качестве нулевого указателя в каком-либо методе, то.. Для NULL придётся добавить инклюд на cstddef/stddef.h. Добавлено через 1 минуту и 29 секунд mes, перечитал два раза твой пост - и так не понял, на какой ты "стороне"? ![]() |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
таки int ;)
2, 4, 8 на моем core2duo, x86_64, gcc 4.3.2 Добавлено через 4 минуты и 54 секунды
возможно это в стандарте, но это + к списку граблей с т. з. грамматики языка и к тому же нелогично 0 - это целое число, а множество значений адресов, формально говоря, не является надмножеством целых чисел ;) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
0 - это нечто страшное ![]() Да, это косяк стандарта, на мой взгляд. Именно потому было предложение про nullptr. Текущие решения ИМХО оба костыльны. Впрочем, целые числа и логический тип (по идее) тоже не должны пересекаться - в С++ здесь лучше (чем в С - впрочем для С это как раз не минус, ибо другой уровень, другое мышление), новполне возможен неявный кастинг.. Да-да, полтора года работы на шарпе дают о себе знать... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
в обычном (ansi) C bool'а нет, так что что там будет пдразумеваться под bool зависит от программиста ;) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Да, я знаю. И это плохо
![]() В С++ же он есть - и это хорошо. Но неявный кастинг из чисел - это плохо ![]() |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ничего не каститься, возвращается int а вот семантика if (...) и аналогов использует значения 0 и не 0 и это абсолютно независимые вещи ;) а вот в C++ идет как раз каст в bool -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Ээ.. ну я и говорю про С++.
Это речь про С. Про С++. "Но" к последней фразе. Тоже про С++. Сорри, если неясно выразился ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |