Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > warning: conversion from 'size_t' to 'int'


Автор: Rutti 10.4.2007, 01:24
Как избавится от подобных предупреждений:

warning C4267: ...: conversion from 'size_t' to 'int', possible loss of data?

Имеется ввиду conversion from 'size_t' to 'int'.

Автор: archimed7592 10.4.2007, 01:26
использовать соответствующие типы для соответствующих ситуаций... по всей видимости тебе достаточно заменить
Код
for (int i = 0; i < ...; ...)
...
на
Код
for (std::size_t i = 0; i < ...; ...)
...

Автор: Xenon 10.4.2007, 01:39
Радикально  smile 
Код

#pragma warning (disable:4267)

Автор: Rutti 10.4.2007, 01:48
Xenon, ну да. Это по MSDN. Но берут сомнения в необходимости disable.
archimed7592, у меня на этот коод ругается:
Код

 char csPos[10];
 itoa(numofserv.size(), csPos, 10);

Автор: Void 10.4.2007, 01:57
В данном случае: забить.

Автор: Greeen 10.4.2007, 07:22
Код

char csPos[10];
itoa((int)numofserv.size(), csPos, 10);

Автор: Earnest 10.4.2007, 08:18
Цитата(Void @  10.4.2007,  02:57 Найти цитируемый пост)
В данном случае: забить. 

Нет, так можно не обратить внимание на что-то существенное.
Варианта 2: как посоветовал archimed7592, по возможности использовать size_t для индексов, когда размер size_t и т.д. Если нельзя, ставить явное преобразование (ну не обязательно reinterpret_cast, a просто в стиле С).
Отключать предупреждение нежелательно - иногда действительно возможна потеря данных. Лучше каждый раз подумать, и явно выразить свои намерения в коде.

Автор: _int64 10.4.2007, 11:16
size_t - unsigned integer

макс. значение size_t в 2 раза больше чем int

Автор: JAnty 10.4.2007, 11:45
(int) i;

Автор: Void 10.4.2007, 16:20
Earnest, я же сказал: в данном случае. Что означало конкретную строчку кода:
Код
itoa(numofserv.size(), csPos, 10);

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

Автор: JackYF 10.4.2007, 17:49
Void, в данном случае я соглашусь с Earnest, варнинги желательно убирать. Здесь (int) поставить не грех, имхо.

Автор: Void 10.4.2007, 18:12
Как прикажете. Срез при unsigned -> signed или, того хуже, 64 -> 32 (сколько я помню, на x64 у VS sizeof(size_t) == 8) от этого никуда не денется.

Автор: Mayk 10.4.2007, 18:27
В c99 можно сделать
snprintf(buf,10,"%zu", expression_with_type_size_t );
и не будет никакой срезки.

Автор: JackYF 10.4.2007, 18:28
Гм... ну эти срезы здесь маловероятны...
вероятность того, что количество элементов в контейнере > 2 млрд? Весьма призрачная, как мне кажется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)