В одном из проектов моего приложения я получаю сообщение об ошибке компиляции:
... \ Program Files (x86) \ Windows Kits \ 8.1 \ Include \ um \ dlgs.h (245): фатальная ошибка RC1017: недопустимое целочисленное константное выражение
Точно, это код, вызывающий проблему:
#if (WINVER >= 0x400) //this line
#define PAGESETUPDLGORD 1546
#define NEWFILEOPENORD 1547
#define PRINTDLGEXORD 1549
#define PAGESETUPDLGORDMOTIF 1550
#define COLORMGMTDLGORD 1551
#define NEWFILEOPENV2ORD 1552
#endif /* WINVER >= 0x400) */
Что кажется странным, потому что в указанных настройках проекта я установил определения препроцессора C / C ++:
WINVER=0x0601;_WIN32_WINNT=0x0601
Где 0x0601 - это значение, соответствующее Windows 7, то есть ОС, которую я использую.
Я добавил этот макрос проверки работоспособности в StdAfx.h, чтобы определить, правильно ли препроцессор видит эти значения:
#define XSTR(x) STR(x)
#define STR(x) #x
#pragma message("WINVER equals:")
#pragma message(XSTR(WINVER))
#pragma message("WIN32_WINNT equals:")
#pragma message(XSTR(_WIN32_WINNT))
И во время сборки я получаю правильные значения:
1>StdAfx.cpp
1>WINVER equals:
1>0x0601
1>WIN32_WINNT equals:
1>0x0601
Обратите внимание, что эта ошибка возникает после того, как cl.exe распечатывает ее на консоли:
1> Генерация кода ...
Из моего исследования кажется, что препроцессор WINVER определен без значения, например:
#define WINVER
Я попытался добавить тот же макрос в заголовки Windows, но они не помещают сообщение pragma в консоль. У меня заканчиваются идеи. Как это может быть, что еще я могу сделать?
Я также попробовал глупое решение вручную отредактировать заголовки набора Windows, чтобы переопределить WINVER на 0x0601, но таких заголовков много, и это всего лишь хак, чтобы быстро выполнить работу.