Потеря данных при приведении типа
От: IlFun Россия  
Дата: 03.09.07 10:58
Оценка:
Есть следующий код:

CAtlArray<MMC_COOKIE> Cookies;
MMC_COOKIE Cookie;
...
Cookies.Add(Cookie); — на этой строке компилятор выдает warning C4244: 'argument' : conversion from 'MMC_COOKIE' to 'long', possible loss of data

Варнинг есть как VS2003 так и в VS2005.

MMC_COOKIE определен следующим образом:

typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef LONG_PTR MMC_COOKIE;

Компилируется все под WIN32.

Если при этом в качестве контейнера используется std::vector<MMC_COOKIE>, то никаких проблем нет.

Подскажите в чем проблема. Заранее спасибо.
Re: Потеря данных при приведении типа
От: Сомов Александр Россия  
Дата: 03.09.07 12:08
Оценка:
IF>Подскажите в чем проблема. Заранее спасибо.

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

Решение. Игнорировать это предупреждение или отключить в том месте, где используется. Ничего хорошего с этим сделать нельзя.
Re[2]: Потеря данных при приведении типа
От: IlFun Россия  
Дата: 03.09.07 14:45
Оценка:
Здравствуйте, Сомов Александр, Вы писали:

СА>Возможно проблема в том, что включена проверка на возможные ошибки при переносе на 64-битную платформу. В MSVC есть ошибка. Он находит явную специализацию CElementTraits, который используется в CAtlArray, при этом при расширении типа на другой платформе будет использоваться другая специализация, и именно этот случай MSCV не замечает и считает, что после расширения начнутся проблемы. На то и ругается.


Да проблема была именно в этом. После отключения опции компиляции Detect 64-bit portability Issues варнинги исчезли.

Спасибо.
Re[3]: Потеря данных при приведении типа
От: Сомов Александр Россия  
Дата: 03.09.07 15:34
Оценка:
IF>Спасибо.

Плюсики ставить надо.
Re[3]: Потеря данных при приведении типа
От: Roman Odaisky Украина  
Дата: 03.09.07 18:28
Оценка:
Здравствуйте, IlFun, Вы писали:

IF>Здравствуйте, Сомов Александр, Вы писали:


СА>>Возможно проблема в том, что включена проверка на возможные ошибки при переносе на 64-битную платформу. В MSVC есть ошибка. Он находит явную специализацию CElementTraits, который используется в CAtlArray, при этом при расширении типа на другой платформе будет использоваться другая специализация, и именно этот случай MSCV не замечает и считает, что после расширения начнутся проблемы. На то и ругается.


IF>Да проблема была именно в этом. После отключения опции компиляции Detect 64-bit portability Issues варнинги исчезли.


Так а зачем ее отключать? Можно вообще cl -W0. Когда-нибудь всё равно придется портировать на 64-битную систему, вот пусть код будет к этому сразу готов.
До последнего не верил в пирамиду Лебедева.
Re[4]: Потеря данных при приведении типа
От: Сомов Александр Россия  
Дата: 03.09.07 19:11
Оценка:
RO>Так а зачем ее отключать? Можно вообще cl -W0. Когда-нибудь всё равно придется портировать на 64-битную систему, вот пусть код будет к этому сразу готов.

В данном случае предупреждение абсолютно незаконное. Такой код будет правильно работать и в 32-битной и в 64-битной системе. Это ошибка компилятора, к тому же признанная Microsoft. Отключать все проверки действительно не стоит, но и корректно обернуть такой код #pragma warning'ами нелегко.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.