Во избежание возможной потери компилятор данных предупреждение


Я пишу в файл ввода/вывода DLL в C++, которая будет использоваться в VB6. Интерфейс уже исправили, и использует в int64/валюты как общий тип данных integer.

Теперь у меня есть эта функция:

extern "C" LPWIN32_FIND_DATAW ZFILEIO_API GetFileInfoByIndex(INT64 index) {
    return total_size >= 0 
        && index <= file_vec->size() 
        && index >= 0 
              ? &file_vec->at(index) 
              : NULL;
}

где file_vec типа СТД::вектор. Ее на член функция принимает значение типа size_t аргумент, что в моем случае беззнаковое 32-разрядное целое число. Поэтому, индекса MSVC++2010 предупреждает о возможной потере данных. Я думаю, что ничего не может случиться в моем коде, но, пожалуйста, поправьте меня, если я ошибаюсь. Кроме того, вы знаете способ, чтобы избежать предупреждения (без отключения его от других мест в моем коде)?

И потом есть еще один вопрос; я хотел бы вернуть WIN32_FIND_DATAW структуры по значению, а не как указатель, но это невозможно, потому что тогда я не смогу вернуть null для незаконного просит. Я могу вернуть указатель на внутренние данные приложения в VB6?



1950
6
задан 25 мая 2011 в 07:05 Источник Поделиться
Комментарии
2 ответа

Ваши типы не совпадают, и вы полагаться на неявное преобразование. Компилятор предупреждает Вас, что не все неявное преобразование в этом случае будет действителен. Если вы знаете, что преобразование является допустимым в вашем случае, то вы должны сделать преобразование в явном виде. Это разумно, чтобы проверить состояние вы полагаетесь на:

extern "C" LPWIN32_FIND_DATAW ZFILEIO_API GetFileInfoByIndex(INT64 index) {
assert(index <= SIZE_MAX);

return total_size >= 0
&& index <= file_vec->size()
&& index >= 0 ? &file_vec->at(static_cast<size_t>(index)) : NULL;
}

Проверка может быть либо утверждать или исключения, в зависимости от того, насколько вы уверены, что это условие не может (даже теоретически) быть нажмите в коде. Возможно, вы также хотите, чтобы убедиться, что диапазон индекса проверяется на более высоком уровне в коде, где она может вызывать более значимые исключения, например, в конструкторе соответствующего типа. Даже если вы делаете это, имея дополнительные проверки в код просто до бросания-это полезно, потому что он проверяет, чтобы будущий Хранитель, что является допустимым.

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

Обратите внимание, что SIZE_MAX не определено в стандарте C++ AFAICT. Это могут быть доступны на вашей платформе, но если не есть почти наверняка другой способ получить ту же информацию, а именно максимальное значение значение типа size_t.

10
ответ дан 26 мая 2011 в 08:05 Источник Поделиться

#pragma warning(disable:4xxx)
yourcode();
#pragma warning(default:4xxx)

Где 4xxx код предупреждения.

Взгляните на статье MSDN

4
ответ дан 25 мая 2011 в 08:05 Источник Поделиться