3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
|
|
1 | |
Что использовать с указателями? 0, NULL, nullptr?16.08.2012, 21:50. Показов 45297. Ответов 34
Метки нет (Все метки)
NULL в WinDef.h описан как #define NULL 0. То есть в случае использования как с указателями, так и другими переменными разницы 0. Про nullptr только час назад узнал, даёт ли он какие-либо реальные преимущества?
Но, вообщем-то, главный вопрос: что использовать?
0
|
16.08.2012, 21:50 | |
Ответы с готовыми решениями:
34
Разница между NULL, nullptr и 0 NULL с указателями Стоит ли использовать null ? Оптимально ли использовать методы расширения для проверки на null? |
16.08.2012, 22:20 | 3 | |||||
Самое банальное
5
|
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
|
|
16.08.2012, 23:14 | 4 |
Сообщение было отмечено как решение
Решение
Rengen, для обнуление указателя лучше использовать nullptr, т.к.:
"Причина введения nullptr в язык С++ заключается в устранение возможных недоразумений между литералом 0 как целочисленным значением и указателем. Двойное значение литерала 0 может вызывать проблемы при некоторых обстоятельствах. Литерал nullptr имеет тип std::nullptr_t, и его нельзя перепутать со значением другого типа. Он может быть неявно преобразован в любой ссылочный тип, но ни в один целочисленный тип, кроме типа bool." - Айвор Хортон, Visual C++ 2010, Глава 4 *примечание.
7
|
542 / 447 / 162
Регистрация: 10.12.2009
Сообщений: 1,857
|
||||||
16.08.2012, 23:42 | 6 | |||||
nullptr рекомендуют использовать в C++11
Добавлено через 3 минуты
0
|
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
|
||||||
17.08.2012, 01:20 | 7 | |||||
по идее, nullptr=NULL=0, но nullptr лучше передавать вместо 0/NULL в функцию если нужно указатель, а проверить указатель можно так:
0
|
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
|
|
19.08.2012, 13:52 [ТС] | 8 |
То есть, опять, что использовать решать мне. Всем спасибо.
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
19.08.2012, 15:42 | 9 | |||||
Сообщение было отмечено как решение
Решение
Для C++ более старых версий nullptr легко добавляется одной строчкой:
9
|
19.08.2012, 15:45 | 10 |
Только если типом NULL/0 является указатель или bool. В противном случае, утверждение неверно.
Если есть возможность использовать nullptr - используйте. Добавлено через 2 минуты Nick Alte, еще каст в bool добавить надо бы для полной совместимости.
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
19.08.2012, 15:58 | 11 | |||||
Пока я такой конструкцией пользовался до перехода на VS 2010, мне такой каст ни разу не пригодился, но пуркуа бы, как говорится, и не па:
0
|
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
|
|
19.08.2012, 16:52 | 12 |
Все проще, лучше использовать стандартный 0 или nullptr, потому что NULL - это макрос компилятора, и он может иметь значение, отличное от 0 - мало что взбредет в голову разработчику компилятора
или на крайний случай: const short NULL = 0;
0
|
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
|
|
19.08.2012, 17:05 | 14 |
Страуструп описывал про макрос NULL:
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
19.08.2012, 17:07 | 15 |
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
19.08.2012, 17:09 | 17 | |||||
да, тогда уж
0
|
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
|
||||||
19.08.2012, 17:11 | 18 | |||||
я юзаю minGW Qt:
компилятор, конечно, предупредил, но позволил компилить я к тому что, что надежнее не писать NULL, а использовать 0
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||||||||||
19.08.2012, 17:28 | 19 | |||||||||||||||
Ну вот пара примеров из той же оперы
header.h:
Так что (в отсутствие nullptr) использовать NULL в качестве «константы» нулевого указателя не менее надежно, чем использовать константы или классы Добавлено через 3 минуты Кстати, в отличие от твоего примера ни один из моих не выдал
2
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
19.08.2012, 17:34 | 20 |
Уже ж сказано, что на NULL и 0 жалуются не по той причине, что NULL можно заменить или что-то ещё, а из-за автоприведения типов в Си++, которое иногда (неочевидным образом) может приводить ваш 0 или NULL (который заменяется на 0) к целому числу и вызывать косяки (тривиальный пример вон в третьем посте).
А эти очевидные грабли с #define NULL 42 — ну, это вы сами себе в ногу стреляете; разработчики языка не обязаны нянчиться с вами. Считайте это — отсутствие токена «невалидный указатель», который обозначает только это, — первородным грехом дизайна языка.
1
|
19.08.2012, 17:34 | |
19.08.2012, 17:34 | |
Помогаю со студенческими работами здесь
20
Значение Null в datagridview вызывает исключение. Не получается использовать Try-Catch Можно ли вместо предиката null использовать предикат (eql l nil)? Сделать функцию, которая принимает одномерный массив и возвращает индексы трех его самых больших элементов(сортировку не использовать), указателями Зачем в качестве параметра передавать null и потом использовать его как массив? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |