[C++]Скажите, это нормально вообще?

erotic

isctype.c
 #if defined (_DEBUG)
extern "C" int __cdecl _chvalidator(
int c,
int mask
)
{
_ASSERTEunsignedc + 1) <= 256);
return _chvalidator_l(NULL, c, mask);
}


Функция проверяет, что переданное значение с - типа char. И вот если ей передать отрицательный char... она, конечно, скажет, что ни хрена это и не char. Это вообще как понимать? MSVC2005

okunek

ну наверно потому что надо передавать беззнаковый char, а не какой попало...

Reves2

надо так
 _ASSERTEunsigned charc + 1) <= 256);

т. к. ты приводишь к unsigned int => если отрицательное то получим 0xffffff.. > 0xff

ppplva

Сильно. Но зачем <=, вполне хватило бы просто <.

Reves2

вполне хватило бы просто
это да )

tamusyav

(unsigned charc + 1) <= 256
А слабо придумать условие, при котором это неверно?
Вообще-то функция не может проверить тип переданного значения (есть, правда, RTTI, но это все-таки из другой оперы). Это вам не VB с его Variant-ом. Можно проверить, укладывается ли значение в некоторый диапазон. Например, диапазон значений типа char:
с >= -128 && c <= 127
или unsigned char:
с >= 0 && c <= 255
Альтернативные варианты (думаю, работают быстрее):
(c + 128) & ~255
c & ~255
Причем все это работает при условии, что char занимает 1 байт.

erotic

Это не я писал, это стандартный файл, находится в VC/crt/src/isctype.c
Поэтому когда я в BOOST тестирую на равенство два значения, хотя бы одно из которых отрицательное типа char, то (видимо, там такая реализация) вызывается для проверки эта функция, и проверка не проходит. Забавно, что если в BOOST_CHECK_EQUALS передать отрицательный char, приведенный к signed char, то такой проверки не производится.

Olyalyau

Выражение
(unsigned charc + 1) <= 256

истинно для любого "c"

vertyal17

А ведь +1?

хотя может наверное зависеть от компилятора

Olyalyau

А ведь +1?
хотя может наверное зависеть от компилятора

Это не зависит от компилятора. Разве что от платформы. Если найдёте платформу, где unsigned char шире 8 бит.
В
  (unsigned charc + 1) 

к типу unsigned char приводится выражение (c+1 после чего значение этого выражения не может превышать 1 << BITS_IN_CHAR) - 1). Последнее на всех известных мне платформах равно 255.
Оставить комментарий
Имя или ник:
Комментарий: