Избавление от предупреждающего сообщения — правильный путь

Я работаю над устаревшим кодом 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 местах. Есть ли способ избавиться от этого предупреждающего сообщения, возможно, с помощью какого-то макроса?
Пожалуйста, предложите.

Спасибо

2

Решение

Вы можете отключить предупреждение с помощью

#pragma warning( disable : 4267)

хотя лично я бы поработал над ошибками и исправил бы правильно. Ваша идея с static_cast неплохой, и нет опасности неопределенного поведения с переполнением при использовании unsigned типы.

Наконец, обратите внимание, что использование макроса для замены стандартной библиотечной функции неопределенное поведение. Не делай этого.

3

Другие решения

Это правильный способ использования 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

1

По вопросам рекламы [email protected]