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