Мы используем тип Integer, представляющий индексные переменные большую часть времени. Но в некоторых ситуациях мы вынуждены выбирать
std::vector<int> vec;
....
for(int i = 0; i < vec.size(); ++i)
....
Это заставит компилятор выдавать предупреждение о смешанном использовании переменных со знаком и без знака. если я сделаю индексную переменную как for( size_t i = 0; i < vec.size(); i++ )
, (или unsigned int
), это решит проблемы.
Когда речь идет о более конкретном использовании типов окон, большинство API-интерфейсов Windows имеют дело с DWORD (который определен как unsigned long).
Поэтому, когда я использую подобную итерацию, снова будет вызывать то же предупреждение. Теперь, если я переписать это как
DWORD dwCount;
....
for(DWORD i = 0; i < dwCount; ++i)
....
Я нахожу это немного странным. Это может быть проблема с восприятием.
Я согласен, что мы должны использовать индексную переменную одного типа, чтобы избежать проблем с диапазоном, которые могут возникнуть с индексными переменными. Например, если мы используем
_int64 i64Count; //
....
for(_int64 i = 0; i < i64Count; ++i)
....
Но в случае DWORD, или целых чисел без знака, есть ли проблемы при переписывании его как
for(int i = 0; (size_t)i < vec.size(); ++i)
Как большинство людей работают с похожими проблемами?
std::size_t
это более высокий ранг, чем int (или даже long). Если размер вектора когда-либо превысит std::numeric_limits<int>::max()
, вы пожалеете, что использовали int.