Ответ зависит от компилятора и набора инструментов. Если вопрос о Visual C++, вы должны пометить его как таковой.
Для версии VC++ поддерживаемая минимальная версия ОС контролируется набором макросов, описанных в Using the Windows Headers.
В простейшем случае целевой XP вы должны добавить
#define _WIN32_WINNT 0x0501
перед включением любой из заголовков окон, или добавить /D_WIN32_WINNT=0x0501
в командной строке компилятора.
Замените 0x0501
на 0x0502
, если вам не нужна поддержка оригинальной версии XP (без каких-либо пакетов обновлений), за одно примечание в той же связанной статье.
Обратите внимание, что некоторые функции, представленные в последней версии Windows, могут быть добавлены в пакет обновления для предыдущей версии Windows. Поэтому, чтобы настроить таргетинг на пакет обновления, вам может потребоваться определить _WIN32_WINNT со значением для следующей крупной версии операционной системы. Например, функция GetDllDirectory была введена в Windows Server 2003 и условно определена, если _WIN32_WINNT равно 0x0502 или выше. Эта функция также была добавлена в Windows XP с пакетом обновления 1 (SP1). Поэтому, если вы должны определить _WIN32_WINNT как 0x0501 для целевой Windows XP, вы пропустите функции, определенные в Windows XP с пакетом обновления 1 (SP1).
P.S. Это вы контролируете источники и флаговые компиляции своего собственного кода, поэтому я не уверен, как ответить на эту часть исходного вопроса.
Какие условные флаги компиляции можно проверить, чтобы определить, какие ОС Windows для компиляции кода?
Я считаю, что системная библиотека: http://www.cplusplus.com/reference/cstdlib/system/ может использоваться для запуска исполняемых файлов. Используя это, вы можете запускать что-то вроде проверки версии Windows. Однако это произойдет только во время выполнения и, вероятно, не так полезно во время компиляции. Не уверен, что это решает вашу проблему, но удачи :) – Liang
Обычно вы не создавали отдельное приложение для Windows XP, вы бы создали одно приложение, которое работает как для XP, так и для более поздних версий. Иногда это означает, что просто использовать WindowsXPCall, который в большинстве случаев будет доступен в более поздних версиях, а иногда это означает принятие решения о том, какой вызов выполнить во время выполнения. –
Если вы действительно хотите создать отдельный исполняемый файл, вы можете обнаружить использование набора инструментов XP в соответствии с [этим вопросом] (http://stackoverflow.com/q/23279157/886887). –