Я хотел бы знать во время компиляции диапазон значений для типа указателя. limits.h
определяет только максимумы и минимумы для чистых числовых типов. Я не хочу использовать жестко запрограммированные константы и предпочитаю не вычислять максимум с помощью sizeof(foo*)
.
Каков идиоматический способ определения ограничений указателя в C ++?
Ответы (2)
Думаю, я бы использовал intptr_t. Он определяется как целое число, которое может содержать значение указателя, поэтому минимальные / максимальные значения intptr_t должны работать.
Он может быть больше, чем значение фактического указателя. Но из вашего объяснения класса, которому нужны только минимальные / максимальные значения, я не верю, что вам нужна полная точность.
intptr_t
в настоящее время не является частью C ++; он был добавлен в C в C99 и будет присутствовать в грядущем стандарте C ++ 0x.
- person James McNellis; 15.07.2010
Указатели - это не числа. В частности, они не совсем упорядочены - учитывая два случайных указателя p
и q
, вы не можете вычесть один из другого и получить значимый результат - это UB, если они оба не указывают на один и тот же объект (блок памяти malloc
, статический или автоматический объект и т. д.). Таким образом, концепция разрешенного диапазона указателей бессмысленна в Стандартном C ++.
std::less<>
. Предположительно, если есть абсолютный порядок, существует также абсолютный диапазон.
- person Dhskjlkakdh; 16.07.2010
<
и >
в этом случае также будет неопределенным. Но на самом деле это хороший момент в отношении std::less
- хотя он не должен определяться в терминах <
для указателей (в Стандарте это довольно ясно) - он по-прежнему определяет абсолютный порядок и, следовательно, диапазон. Однако ему не нужно сопоставлять фактические адреса, и я почти уверен, что нет никакого способа узнать минимальное и максимальное (в терминах std::less
) значения, не перечислив их все.
- person Pavel Minaev; 16.07.2010
#defines
, зависящие от компилятора, которые вам это скажут. - person Eclipse   schedule 15.07.2010sizeof
? - person James McNellis   schedule 15.07.2010