Использование предупреждающих сообщений компилятора

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

Входящий в состав Microsoft Visual Studio 7.0 (.NET) компилятор C++ компании Microsoft может конфигурироваться для выдачи таких сообщений. Для этого достаточно задать в командной строке компилятора опции –Wp64 и –W3. В Visual Studio для установки этих опций потребуется выполнить следующие действия:

• Выберите страницу Project Properties (Свойства проекта).

• Откройте папку C++.

• Щелкните на кнопке General (Общие).

• Выберите вкладку Detect 64-bit Portability Issues (Определять элементы переноса в 64 разряда) и выберите вариант Yes (/Wp64) (Да (/Wp64)). Оставьте для уровня диагностики (warning level) значение 3.

После этого, в процессе сборки проекта в окне вывода будут отображаться соответствующие предупреждающие сообщения. При построении в Microsoft Visual Studio 7.0 проектов, которые находятся на Web-сайте книги, вывод предупреждающих сообщений конфигурировался именно так, как описано выше.

Код до подготовки к переносу

Большая часть программного кода sortMM.с не приводит к выдаче предупреждающих сообщений, но один участок кода на шаге 6 (см. программу 5.5) вызывает их генерацию. Соответствующий фрагмент кода вместе с номерами строк представлен в программе 16.1. Имейте в виду, что в последующих версиях этой программы номера строк могут поменяться.

Программа 16.1. sortMM.с: код до подготовки к переносув Win64, часть 1

54 LPBYTE pXFile = NULL, pX;

55 TCHAR _based (pInFile) *pIn;

131 if (!NoPrint)

132 for (iKey = 0; iKey < FsX / RSize; iKey++) {

133 WriteFile(hStdOut, &ChNewLine, TSIZE, &nWrite, NULL);

135 /* Приведение типа рХ играет весьма важную роль, поскольку это

136 указатель на байт, а нам нужны четыре байта указателя типа _based. */

137 pIn = (TCHAR _based(pInFile)*)*(LPDWORD)pX;

139 while ((*pIn != CR || *(pIn + 1) != LF) && (DWORD)pIn < FsIn) {

140 WriteFile(hStdOut, pIn, TSIZE, &nWrite, NULL);

141 pIn++;

142 }

143 pX += RSize;

144 }

Сообщения компилятора далее приводятся, но прежде чем ознакомиться с ними, вы, возможно, захотите просмотреть код, чтобы определить возможные причины выдачи будущих предупреждающих сообщений. Не забывайте о том, что нашей целью является придание программе такого вида, который обеспечивает ее сборку и корректное выполнение как в режиме Win32, так и в режиме Win64.