Я работаю над устаревшим кодом pro * C / C ++ и перенес проект в Visual Studio 2015. Когда я компилирую код в VS, он выдает мне предупреждающее сообщение ниже в более чем 100 местах.
warning C4267: '=': conversion from 'size_t' to 'unsigned short', possible loss of data
и соответствующий код
stmt.len = strlen((char*)stmt.arr); // VARCHAR stmt[500];
Я планировал изменить вышеуказанный код на
stmt.len = static_cast<unsigned short>(strlen((char *)stmt.arr));
это просто удалит предупреждающее сообщение. Но я должен изменить более чем в 100 местах. Есть ли способ избавиться от этого предупреждающего сообщения, возможно, с помощью какого-то макроса?
Пожалуйста, предложите.
Спасибо
Вы можете отключить предупреждение с помощью
#pragma warning( disable : 4267)
хотя лично я бы поработал над ошибками и исправил бы правильно. Ваша идея с static_cast
неплохой, и нет опасности неопределенного поведения с переполнением при использовании unsigned
типы.
Наконец, обратите внимание, что использование макроса для замены стандартной библиотечной функции неопределенное поведение. Не делай этого.
Это правильный способ использования size_t
последовательно. Или там делать кастинг который ты хоть как обновление.
Предлагается обходной путь предупреждений C4267 и способы их отключения. Вот является:
#pragma warning (disable : 4267)
Для макроса #define (только образец)
#include <iostream>
#include <string.h>
#define strlen(x) static_cast<unsigned short>(strlen((char *)x))
//I tested with ((char *)x+1) and ((char *)x+2) for variation
using namespace std;
int main() {
char stmt[] = "something";
int len = strlen((char*)stmt); // VARCHAR stmt[500];
cout << len;
return 0;
}
Тестовое задание Вот с IDEONE