C6328
Обновлен: Ноябрь 2007
C6328
Предупреждение C6328. <тип> передан как параметр <номер>, хотя требуется <тип> при вызове <функция>
Для подпрограмм, начинающихся с "is*", передача аргумента типа char может привести к непредсказуемым результатам. Например, однобайтовый знак типа char со значением, превышающем 0x7F, в однобайтовой или многобайтовой кодировке является отрицательным. Если передается значение типа char, компилятор может преобразовать это значение в значение типа int со знаком или типа long со знаком. Данное значение может быть расширено знаком компилятором, что приведет к непредвиденным результатам. Например, функция isspace принимает аргумент типа int; однако допустимые значения этого входного аргумента должны находиться в следующем диапазоне:
0 <= c <= 255 (плюс особое значение конца файла).
Пример
По умолчанию char является в Visual C++ типом со знаком, то есть значения переменной типа char могут находиться в диапазоне -128 <= c <= 127. Поэтому при реализации следующего кода:
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( c );
// code...
}
переменная c будет расширена знаком и приведена к учитывающему знак типу int со значением -37, которое находится за пределами допустимого диапазона функции isspace.
Для устранения этого предупреждения используйте оператор static_cast, как указано в следующем коде:
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( static_cast<unsigned char> (c) );
// code...
}
Предупреждение C6328 специально предназначено для обнаружения этой ошибки. Для знаков в 7-битовом диапазоне ASCII приведение не требуется, однако наличие знаков за пределами допустимого диапазона приведет к утверждениям и (или) сбоям во время выполнения.