NULL и функции с неуказанным количеством аргументов
От: Slimp  
Дата: 02.10.07 01:31
Оценка:
В стандартных инклудах NULL определен как:
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif


Все было бы замечательно, если бы не появились 64 разрядные системы, в которых (void *)0 и 0 имеют различную длинну.
В функциях типа execl, в качестве поcледнего указателя должен быть 0. Соответственно не 0, не NULL там писать нельзя.
В принципе, даже в манах рекомендуют (char *)0 — такая конструкция всегда работает нормально, но мне не нравится

Я понимаю, что можно NULL задефайнить самостоятельно так, как тебе нравится, но вопрос собственно в другом.
С какой тайной целью NULL так определили ? Почему он в С++ равен 0, а в С ((void *)0) ?
Re: NULL и функции с неуказанным количеством аргументов
От: Кодт Россия  
Дата: 02.10.07 08:05
Оценка:
Здравствуйте, 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), чтобы не смешивать числа и указатели.
Но вот не сделали. Пожалели лишнее ключевое слово.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Как обычно, две идеи :)
От: Erop Россия  
Дата: 02.10.07 13:12
Оценка:
Здравствуйте, 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 и функции с неуказанным количеством аргументов
От: _nn_ www.nemerleweb.com
Дата: 02.10.07 13:23
Оценка:
Здравствуйте, Slimp, Вы писали:

S>В стандартных инклудах NULL определен как:

S>
S>#if defined(__cplusplus)
S>#define NULL 0
S>#else
S>#define NULL ((void *)0)
S>#endif
S>


S>Все было бы замечательно, если бы не появились 64 разрядные системы, в которых (void *)0 и 0 имеют различную длинну.

S>В функциях типа execl, в качестве поcледнего указателя должен быть 0. Соответственно не 0, не NULL там писать нельзя.
S>В принципе, даже в манах рекомендуют (char *)0 — такая конструкция всегда работает нормально, но мне не нравится

S>Я понимаю, что можно NULL задефайнить самостоятельно так, как тебе нравится, но вопрос собственно в другом.

S>С какой тайной целью NULL так определили ? Почему он в С++ равен 0, а в С ((void *)0) ?


Один из вариантов использовать boost::null.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: NULL и функции с неуказанным количеством аргументов
От: Erop Россия  
Дата: 02.10.07 13:33
Оценка: +1
Здравствуйте, _nn_, Вы писали:

__>Один из вариантов использовать boost::null.

А разве он не объект? Предача объектов в функции с переменным числом параметров вроде бы ведёт к последствиям зависящим от реализации...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: NULL и функции с неуказанным количеством аргументов
От: Roman Odaisky Украина  
Дата: 02.10.07 14:56
Оценка:
Здравствуйте, Slimp, Вы писали:

S>В стандартных инклудах NULL определен как:

S>
S>#if defined(__cplusplus)
S>#define NULL 0
S>#else
S>#define NULL ((void *)0)
S>#endif
S>


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) ?

Пусть #define CPPNULL 0, #define CNULL ((void *)0).

int* p1 = CPPNULL;
int* p2 = CNULL; // ?

А вот еще код для медитации:
int const zero = 0;

void f(int const *)
{
}

f(zero);

Он well-formed или нет? ;-)
До последнего не верил в пирамиду Лебедева.
Re[3]: NULL и функции с неуказанным количеством аргументов
От: _nn_ www.nemerleweb.com
Дата: 02.10.07 15:20
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, _nn_, Вы писали:


__>>Один из вариантов использовать boost::null.

E>А разве он не объект? Предача объектов в функции с переменным числом параметров вроде бы ведёт к последствиям зависящим от реализации...
Точно.

Вывод: Не должно быть функций с переменным числом параметров в С++
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: NULL и функции с неуказанным количеством аргументов
От: Erop Россия  
Дата: 02.10.07 15:58
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Точно.

__>Вывод: Не должно быть функций с переменным числом параметров в С++
А может лучше boost бездумно не использовать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: NULL и функции с неуказанным количеством аргументов
От: Vain Россия google.ru
Дата: 02.10.07 17:52
Оценка:
Здравствуйте, Slimp, Вы писали:

Герб саттер в "40 новых головоломных примерах с решениями":
Где-то так:
class NullType {
private:
  //As address return void and operator is inaccessible
  void operator &() const;
  //As pointee return void and operator is inaccessible
  void operator *() const;
  //Implicit casts to scalars is inaccessible
  operator bool() const;
  operator char() const;
  operator unsigned char() const;
  operator short() const;
  operator unsigned short() const;
  operator int() const;
  operator unsigned int() const;
  operator long() const;
  operator unsigned long() const;
  operator __int64() const;
  operator unsigned __int64() const;
  operator float() const;
  operator double() const;
  operator long double() const;
public:
  //NULL-like semantics
  template<class T> operator T*() const { return 0; }
  template<class C,class T> operator T C::*() const { return 0; }
};

//NULL placeholder
class : public NullType {
} const* const g_pNullObject = 0;

#define MY_NULL (*::g_pNullObject)

void foo(int) {}
void foo(void*) {}

int main() {
  //foo(MY_NULL); //в msvc80 терь низзя
  foo((void*)MY_NULL); //работает
  return 0;
}
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: NullType тоже не в тему!!!
От: Erop Россия  
Дата: 02.10.07 18:01
Оценка:
Здравствуйте, Vain, Вы писали:

V>Герб саттер в "40 новых головоломных примерах с решениями":

V>Где-то так:
Аргументация такая же, как и тут
Автор: Erop
Дата: 02.10.07
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: NULL и функции с неуказанным количеством аргументов
От: igna Россия  
Дата: 02.10.07 18:02
Оценка:
Здравствуйте, Vain, Вы писали:

V>Герб саттер в "40 новых головоломных примерах с решениями":


Не нашел. Номер не подскажешь?
Re[3]: NULL и функции с неуказанным количеством аргументов
От: Vain Россия google.ru
Дата: 02.10.07 20:10
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

V>>Герб саттер в "40 новых головоломных примерах с решениями":

I>Не нашел. Номер не подскажешь?
Так и думал что напутаю..
Это был Скот Майерс, "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов" — правило 25.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: NULL и функции с неуказанным количеством аргументов
От: Slimp  
Дата: 03.10.07 02:15
Оценка:
Здравствуйте, Slimp, Вы писали:

Народ, вы читать умеете? Я не спрашивал, что с этим делать (хотя почитать ваши советы было интересно).
Больше всего согласен с _nn_, в том, что "Не должно быть функций с переменным числом параметров в С++".

Но дело не в этом. Мне больше интересна логика тех людей, кто такую конструкцию придумал (я имею ввиду различное объявление NULL в С и С++).
Ведь наверняка не просто так. В этом и был вопрос, а не в том, что делать. Почему так сделано?
Re[2]: Вопросы и ответы
От: Erop Россия  
Дата: 03.10.07 06:23
Оценка:
Здравствуйте, Slimp, Вы писали:

S>Ведь наверняка не просто так. В этом и был вопрос, а не в том, что делать. Почему так сделано?


1) Фраза

такая конструкция всегда работает нормально, но мне не нравится

воспринимается как просьба о совете что делать, а сам "главный" вопрос воспринимается, как риторический.

2) Собственно зачем.
Тебя интересует зачем так сделано в С или почему так сделано в С++?
В С так сделано потому что так придумали "отцы основатели". NULL это нулевое значение любого указателя и только его. Cкажем
 int p = NULL;
написать в С нельзя. Это типа удобно и выразительно. Зато любой указатель можно инициализировать при помощи NULL, так как указатели в C приводятся свободно от void*.
Ну а в С++ строгая типизация с небольшими отступлениями, так что отсавить NULL таким, как в С не получается. Пришлось хачить. Вот такое отступление.
Ну а почему пожалели специальное ключевое слово скажем cpp_null — , возможно секрет в том, что у Страуструпа не было бесконечного бюджета на изыскания...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Вопросы и ответы
От: _nn_ www.nemerleweb.com
Дата: 03.10.07 07:01
Оценка:
Здравствуйте, 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), он не подумал

nullptr на подходе.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Вопросы и ответы
От: Slimp  
Дата: 03.10.07 23:59
Оценка:
Здравствуйте, 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 СССР  
Дата: 04.10.07 07:24
Оценка:
Slimp пишет:

> Больше всего согласен с _nn_, в том, что "Не должно быть функций с

> переменным числом параметров в С++".

Что значит — "не должно" ? Ведь хочется же иногда...
Posted via RSDN NNTP Server 2.1 beta
Re[3]: NULL и функции с неуказанным количеством аргументов
От: Erop Россия  
Дата: 04.10.07 07:41
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> Больше всего согласен с _nn_, в том, что "Не должно быть функций с

>> переменным числом параметров в С++".

MZ>Что значит — "не должно" ? Ведь хочется же иногда...


Ну надо думать, как обойтись другими методами.

Хотя иногда всё равно "хочется"
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.