Здравствуйте, SWW, Вы писали:
SWW>То есть ненависть к макросам привела к тому, что Страуструпу пришлось снабдить сам язык столь необычным свойством. Кстати, неявные преобразования также им не приветствуются, но вероятно это он считает меньшим злом.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, Heyyou, Вы писали:
А>>>Что лучше применять для пустых указателей 0 или NULL или может А>>>reinterpret_cast<SOME_TYPE*>(0)/ Я применяю 0 но это вроде бы не очень наглядно. Например в Паскале 0 это не nil
H>>по-моему без разницы, так как: H>>#define NULL 0. H>>а можно так и вообще FALSE использовать, так как опять же H>>#define FALSE 0, H>>тем более, что часто тестируя валидность указателей мы делаем это именно так H>>if(somePointer){ H>> doSomething; H>>}
АТ>В языке С++ нет никакого 'FALSE', поэтому к тестированию указателей через 'if' оно никакого отношения не имеет и иметь не может.
дык и 'NULL' тогда нету, оно определено в afx.h равно как и 'FALSE', а так как и то и другое всего лишь 0, то они вполне взаимозаменяемы.
SWW>>То есть ненависть к макросам привела к тому, что Страуструпу пришлось снабдить сам язык столь необычным свойством. Кстати, неявные преобразования также им не приветствуются, но вероятно это он считает меньшим злом.
ME>А как бы выглядел макрос?
Как я уже писал, в Си NULL определялся как ((void*)0). Сейчас (в С++) просто 0.
Здравствуйте, SWW, Вы писали:
SWW>>>То есть ненависть к макросам привела к тому, что Страуструпу пришлось снабдить сам язык столь необычным свойством. Кстати, неявные преобразования также им не приветствуются, но вероятно это он считает меньшим злом.
ME>>А как бы выглядел макрос?
SWW>Как я уже писал, в Си NULL определялся как ((void*)0). Сейчас (в С++) просто 0.
Т.е. ты за такую дыру в системе типов?
void* pv = 0;
int* pi = pv;
Т.е. указатель на void будет неявно преобразовываться в указатель любого типа?
Re[10]: Что лучше применять для пустых указателей
От:
Аноним
Дата:
31.07.03 09:14
Оценка:
Здравствуйте, SWW, Вы писали:
SWW>То есть ненависть к макросам привела к тому, что Страуструпу пришлось снабдить сам язык столь необычным свойством. Кстати, неявные преобразования также им не приветствуются, но вероятно это он считает меньшим злом.
Причем здесь Страуструп? "Столь необычным свойством" обладает и Си.
Re[4]: Что лучше применять для пустых указателей
От:
Аноним
Дата:
31.07.03 09:15
Оценка:
Здравствуйте, Heyyou, Вы писали:
H>дык и 'NULL' тогда нету, оно определено в afx.h равно как и 'FALSE', а так как и то и другое всего лишь 0, то они вполне взаимозаменяемы.
Макрос NULL, в отличие от FALSE, описан в стандарте языка. И он определяется не в afx.h (равно как и FALSE), а в ряде стандартных заголовков.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Heyyou, Вы писали:
H>>дык и 'NULL' тогда нету, оно определено в afx.h равно как и 'FALSE', а так как и то и другое всего лишь 0, то они вполне взаимозаменяемы.
А>Макрос NULL, в отличие от FALSE, описан в стандарте языка. И он определяется не в afx.h (равно как и FALSE), а в ряде стандартных заголовков.
каких?
Re[6]: Что лучше применять для пустых указателей
От:
Аноним
Дата:
31.07.03 09:34
Оценка:
Здравствуйте, Heyyou, Вы писали:
А>>Макрос NULL, в отличие от FALSE, описан в стандарте языка. И он определяется не в afx.h (равно как и FALSE), а в ряде стандартных заголовков.
H>каких?
Здравствуйте, SWW, Вы писали:
ME>>В D&E Страуструп пишет, что любое константное выражение со значением 0 может быть неявно преобразовано в нулевой указатель. Не гарантируется, что нулевой указатель будет представлен той же последовательностью битов, что и целое 0. Гарантируется, что нулевой указатель отличим от остальных указателей того же типа.
SWW>То есть ненависть к макросам привела к тому, что Страуструпу пришлось снабдить сам язык столь необычным свойством. Кстати, неявные преобразования также им не приветствуются, но вероятно это он считает меньшим злом.
"Необычным"? Что же тут необычного? Например, если переменная типа 'double' инициализируется значением '0', то это совсем не гарантирует, что в результате память, занимаемая этой переменной, будет заполнена только нулевыми битами. Чем будет заполнена память зависит от того, каким образом представляется значение '0.0' в формате чисел с плавающей точкой данной платформы. Точно такая же ситуация имеет место с указателями. Это ни что иное как разница между логическим значением и его физическим представлением. Совершенно естественная вещь. Ничего необычного.
Здравствуйте, Heyyou, Вы писали:
H>Здравствуйте, Андрей Тарасевич, Вы писали:
А>>>>Что лучше применять для пустых указателей 0 или NULL или может А>>>>reinterpret_cast<SOME_TYPE*>(0)/ Я применяю 0 но это вроде бы не очень наглядно. Например в Паскале 0 это не nil
H>>>по-моему без разницы, так как: H>>>#define NULL 0. H>>>а можно так и вообще FALSE использовать, так как опять же H>>>#define FALSE 0, H>>>тем более, что часто тестируя валидность указателей мы делаем это именно так H>>>if(somePointer){ H>>> doSomething; H>>>}
АТ>>В языке С++ нет никакого 'FALSE', поэтому к тестированию указателей через 'if' оно никакого отношения не имеет и иметь не может.
H>дык и 'NULL' тогда нету, оно определено в afx.h равно как и 'FALSE', а так как и то и другое всего лишь 0, то они вполне взаимозаменяемы.
Макрос 'NULL' определен в <cstddef> и описан в стандарте языка С++, т.е. является частью языка. Чего нельзя сказать про 'FALSE'.
На самом деле речь идет даже и не об этом. При вышеприведенном использовании 'if' для тестирования указателей в языке С++ выполняется преобразование указателя к встроенному типу 'bool', который принимает значения 'true' и 'false'. При этом 'true' и 'false' — литералы языка, а не макросы. Т.е. никакой 'FALSE' к данному использованию 'if' никакого отношения не имеет.
В С все происходит несколько по иному (непринципиально), но тоже безо всяких 'FALSE'.
Здравствуйте, Вы писали:
> Что лучше применять для пустых указателей 0 или NULL или может > reinterpret_cast<SOME_TYPE*>(0)/ Я применяю 0 но это вроде бы не очень > наглядно. Например в Паскале 0 это не nil