Все было бы замечательно, если бы не появились 64 разрядные системы, в которых (void *)0 и 0 имеют различную длинну.
В функциях типа execl, в качестве поcледнего указателя должен быть 0. Соответственно не 0, не NULL там писать нельзя.
В принципе, даже в манах рекомендуют (char *)0 — такая конструкция всегда работает нормально, но мне не нравится
Я понимаю, что можно NULL задефайнить самостоятельно так, как тебе нравится, но вопрос собственно в другом.
С какой тайной целью NULL так определили ? Почему он в С++ равен 0, а в С ((void *)0) ?
Re: NULL и функции с неуказанным количеством аргументов
Здравствуйте, Slimp, Вы писали:
S>Все было бы замечательно, если бы не появились 64 разрядные системы, в которых (void *)0 и 0 имеют различную длинну. S>В функциях типа execl, в качестве поcледнего указателя должен быть 0. Соответственно не 0, не NULL там писать нельзя. S>В принципе, даже в манах рекомендуют (char *)0 — такая конструкция всегда работает нормально, но мне не нравится
Больше того, та же фигня должна наблюдаться на 16-битных системах с huge моделью памяти (32-битными указателями).
S>Я понимаю, что можно NULL задефайнить самостоятельно так, как тебе нравится,
Можно даже задефайнить #define true false, но делать это не следует.
S> но вопрос собственно в другом. S>С какой тайной целью NULL так определили ? Почему он в С++ равен 0, а в С ((void *)0) ?
Потому что литерал 0 в С++ значит "что угодно, нулевое по сути". В частности, это любой нулевой типизированный указатель на объект, функцию или член.
void foo(int* x);
int main()
{
foo( (void*)0 ); // ошибка: приведение void* к int*
}
Конечно, было бы корректнее ввести именованные константы null (а то и null, nullfun, nullmember, nullmemberfun), чтобы не смешивать числа и указатели.
Но вот не сделали. Пожалели лишнее ключевое слово.
Здравствуйте, Slimp, Вы писали:
S>Я понимаю, что можно NULL задефайнить самостоятельно так, как тебе нравится, но вопрос собственно в другом. S>С какой тайной целью NULL так определили ? Почему он в С++ равен 0, а в С ((void *)0) ?
Идея 1) Отказаться от использования макроса NULL в С++ коде, чтобы не вводить себя в заблуждение
Идея 2) Завести себе константу какую-нибудь подходящую, макрос или шаблонную фунуцию.
Скажем так:
const void* const VoidNull = 0;
, так:
#define LONG_NULL ((long)0)
или так:
template<typename T> T* GetNull() { return 0; }
Соответсвенно сможешь писать
f( LONG_NULL );
f( GetNull<void>() );
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: NULL и функции с неуказанным количеством аргументов
S>Все было бы замечательно, если бы не появились 64 разрядные системы, в которых (void *)0 и 0 имеют различную длинну. S>В функциях типа execl, в качестве поcледнего указателя должен быть 0. Соответственно не 0, не NULL там писать нельзя. S>В принципе, даже в манах рекомендуют (char *)0 — такая конструкция всегда работает нормально, но мне не нравится
S>Я понимаю, что можно NULL задефайнить самостоятельно так, как тебе нравится, но вопрос собственно в другом. S>С какой тайной целью NULL так определили ? Почему он в С++ равен 0, а в С ((void *)0) ?
Здравствуйте, _nn_, Вы писали:
__>Один из вариантов использовать boost::null.
А разве он не объект? Предача объектов в функции с переменным числом параметров вроде бы ведёт к последствиям зависящим от реализации...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: NULL и функции с неуказанным количеством аргументов
S>Все было бы замечательно, если бы не появились 64 разрядные системы, в которых (void *)0 и 0 имеют различную длинну.
А стандарт никогда и не обещал, что sizeof(0) == sizeof(void *).
S>В функциях типа execl, в качестве поcледнего указателя должен быть 0. Соответственно не 0, не NULL там писать нельзя. S>В принципе, даже в манах рекомендуют (char *)0 — такая конструкция всегда работает нормально, но мне не нравится :)
«...» пришло из C. Его и использовать надо по-сишному.
S>Я понимаю, что можно NULL задефайнить самостоятельно так, как тебе нравится, но вопрос собственно в другом. S>С какой тайной целью NULL так определили ? Почему он в С++ равен 0, а в С ((void *)0) ?
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, _nn_, Вы писали:
__>>Один из вариантов использовать boost::null. E>А разве он не объект? Предача объектов в функции с переменным числом параметров вроде бы ведёт к последствиям зависящим от реализации...
Точно.
Вывод: Не должно быть функций с переменным числом параметров в С++
Здравствуйте, _nn_, Вы писали:
__>Точно. __>Вывод: Не должно быть функций с переменным числом параметров в С++
А может лучше boost бездумно не использовать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: NULL и функции с неуказанным количеством аргументов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: NULL и функции с неуказанным количеством аргументов
Здравствуйте, igna, Вы писали:
V>>Герб саттер в "40 новых головоломных примерах с решениями": I>Не нашел. Номер не подскажешь?
Так и думал что напутаю..
Это был Скот Майерс, "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов" — правило 25.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: NULL и функции с неуказанным количеством аргументов
Народ, вы читать умеете? Я не спрашивал, что с этим делать (хотя почитать ваши советы было интересно).
Больше всего согласен с _nn_, в том, что "Не должно быть функций с переменным числом параметров в С++".
Но дело не в этом. Мне больше интересна логика тех людей, кто такую конструкцию придумал (я имею ввиду различное объявление NULL в С и С++).
Ведь наверняка не просто так. В этом и был вопрос, а не в том, что делать. Почему так сделано?
Здравствуйте, Slimp, Вы писали:
S>Ведь наверняка не просто так. В этом и был вопрос, а не в том, что делать. Почему так сделано?
1) Фраза
такая конструкция всегда работает нормально, но мне не нравится
воспринимается как просьба о совете что делать, а сам "главный" вопрос воспринимается, как риторический.
2) Собственно зачем.
Тебя интересует зачем так сделано в С или почему так сделано в С++?
В С так сделано потому что так придумали "отцы основатели". NULL это нулевое значение любого указателя и только его. Cкажем
int p = NULL;
написать в С нельзя. Это типа удобно и выразительно. Зато любой указатель можно инициализировать при помощи NULL, так как указатели в C приводятся свободно от void*.
Ну а в С++ строгая типизация с небольшими отступлениями, так что отсавить NULL таким, как в С не получается. Пришлось хачить. Вот такое отступление.
Ну а почему пожалели специальное ключевое слово скажем cpp_null — , возможно секрет в том, что у Страуструпа не было бесконечного бюджета на изыскания...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Slimp, Вы писали:
S>>Ведь наверняка не просто так. В этом и был вопрос, а не в том, что делать. Почему так сделано?
E>1) Фраза
такая конструкция всегда работает нормально, но мне не нравится
воспринимается как просьба о совете что делать, а сам "главный" вопрос воспринимается, как риторический.
E>2) Собственно зачем. E>Тебя интересует зачем так сделано в С или почему так сделано в С++? E>В С так сделано потому что так придумали "отцы основатели". NULL это нулевое значение любого указателя и только его. Cкажем
int p = NULL;
написать в С нельзя. Это типа удобно и выразительно. Зато любой указатель можно инициализировать при помощи NULL, так как указатели в C приводятся свободно от void*. E>Ну а в С++ строгая типизация с небольшими отступлениями, так что отсавить NULL таким, как в С не получается. Пришлось хачить. Вот такое отступление. E>Ну а почему пожалели специальное ключевое слово скажем cpp_null — , возможно секрет в том, что у Страуструпа не было бесконечного бюджета на изыскания...
Может ему больше нравилось писать 0, а о том, что делать если sizeof(void*)!=sizeof(int), он не подумал
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Slimp, Вы писали:
S>>Ведь наверняка не просто так. В этом и был вопрос, а не в том, что делать. Почему так сделано?
E>1) Фраза
такая конструкция всегда работает нормально, но мне не нравится
воспринимается как просьба о совете что делать, а сам "главный" вопрос воспринимается, как риторический.
Приношу свои извинения, иногда бываю вспыльчив и резок. Я был неправ. Просто, когда читаешь собственный вопрос, приоритеты как-то сами собой расставляются
E>2) Собственно зачем. E>Тебя интересует зачем так сделано в С или почему так сделано в С++? E>В С так сделано потому что так придумали "отцы основатели". NULL это нулевое значение любого указателя и только его. Cкажем
int p = NULL;
написать в С нельзя. Это типа удобно и выразительно. Зато любой указатель можно инициализировать при помощи NULL, так как указатели в C приводятся свободно от void*. E>Ну а в С++ строгая типизация с небольшими отступлениями, так что отсавить NULL таким, как в С не получается. Пришлось хачить. Вот такое отступление.
Да сишный NULL указателю на объект не присвоишь ...
Мир не совершенен
Re[2]: NULL и функции с неуказанным количеством аргументов
Здравствуйте, MasterZiv, Вы писали:
>> Больше всего согласен с _nn_, в том, что "Не должно быть функций с >> переменным числом параметров в С++".
MZ>Что значит — "не должно" ? Ведь хочется же иногда...
Ну надо думать, как обойтись другими методами.
Хотя иногда всё равно "хочется"
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском