предупреждение C4244: «аргумент»: преобразование из «SIZE_T» в «DWORD», возможная потеря данных - PullRequest
3 голосов
/ 14 ноября 2008

Мне нужно иметь набор перегруженных функций в моем коде, но я получаю конверсии. Вот тестовый код:

#include windows.h

void f(DWORD arg){...}

//void f(SIZE_T arg){}

void main(void)
{
DWORD dword=0;
SIZE_T size_t=dword;
f(size_t);

}

Компилятор выдает предупреждение:

test.cpp(11) : warning C4244: 'argument' : conversion from 'SIZE_T' to 'DWORD', possible loss of data

Если я раскомментирую void f (SIZE_T arg), я получу

test.cpp(5) : error C2084: function 'void f(DWORD)' already has a body

Как мне избежать этого предупреждения или ошибки?

Ответы [ 3 ]

13 голосов
/ 14 ноября 2008

size_t гарантированно является целым типом без знака, но количество битов в нем не указано. Он может быть равен DWORD (32 бита) или 64-битным на 64-битной платформе. Для максимальной переносимости не следует предполагать, что он имеет определенное количество битов, о чем вас предупреждает компилятор. Если вы знаете, что ваше значение никогда не превысит 2 ^ 32 (что является разумным предположением в 99,99% случаев), то вы можете просто привести к DWORD, чтобы избавиться от предупреждения:

SIZE_T sz = dword;
f((DWORD)sz);  // no warning here

Ошибка, которую вы получаете, заключается в том, что в вашем случае size_t на самом деле является 32-битным, и поэтому сигнатуры функций ваших двух f функций идентичны - они оба принимают один 32-битный параметр без знака. Вам придется использовать для них отдельные имена, чтобы гарантировать переносимость вашей программы между 32- и 64-битными платформами:

void f_DWORD(DWORD arg) { ... }
void f_size_t(size_t arg) { ... }

Последнее замечание: size_t является встроенным типом. SIZE_T является нестандартным и почти наверняка является typedef или #define для size_t. Вы должны использовать size_t вместо SIZE_T, и вам также следует избегать именования ваших переменных size_t, так как это вводит в заблуждение, скрывая имя типа с именем переменной.

0 голосов
/ 05 мая 2016

SIZE_T занимает 8 байтов в 64-битной системе, а DWORD - 4 байта

из Типы данных Windows

typedef ULONG_PTR SIZE_T;

#if defined(_WIN64)
 typedef unsigned __int64 ULONG_PTR;
#else
 typedef unsigned long ULONG_PTR;
#endif
0 голосов
/ 15 ноября 2008

Самый простой ответ - избавиться от f(DWORD) и переопределить его f(size_t). Если, конечно, f() не работает с значениями, отличными от size_t с.

...