Поделиться через


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 приведение не требуется, однако наличие знаков за пределами допустимого диапазона приведет к утверждениям и (или) сбоям во время выполнения.