У меня есть два набора инструментов для платформы: v110 и v110_xp для моего проекта, и в зависимости от выбранной платформы я хочу включить / исключить часть кода, подлежащего компиляции.
_MSC_FULL_VER
а также $(PlatformToolsetVersion)
имеют одинаковое значение для обоих этих наборов инструментов платформы. В качестве альтернативы я пытался использовать $(PlatformToolset)
следующее:
_MSC_PLATFORM_TOOLSET=$(PlatformToolset)
но проблема в том, что $(PlatformToolset)
не числовой Было интересно, как я могу использовать это нечисловое значение в качестве директивы препроцессора?
Пробуя несколько решений, я понял, что
_MSC_PLATFORM_TOOLSET='$(PlatformToolset)'
а потом
#if (_MSC_PLATFORM_TOOLSET=='v110')
[Something]
#endif
работает нормально но
#if(_MSC_PLATFORM_TOOLSET == 'v110_xp')
[SomethingElse]
#endif
результаты в «слишком много символов в символьной константе» ошибка.
Для контекста, пожалуйста, смотрите этот похожий вопрос:
Visual Studio: как программно проверить используемый набор инструментов платформы C ++
Идти к project properties -> C/C++ -> Preprocessor
и добавить следующее к Preprocessor Definitions
:
_MSC_PLATFORM_TOOLSET_$(PlatformToolset)
Тогда вы можете написать что-то вроде этого:
#ifdef _MSC_PLATFORM_TOOLSET_v110
[Something]
#endif
#ifdef _MSC_PLATFORM_TOOLSET_v110_xp
[SomethingElse]
#endif
Это работает для меня в VS2010.
Для VS 2012/2013, если вы используете набор инструментов обратной совместимости, _USING_V110_SDK71_ будет доступен для использования. VS2013 будет определять одно и то же имя независимо от имени набора инструментов платформы, которое является v120_xp.
#if (_MSC_VER >= 1700) && defined(_USING_V110_SDK71_)
// working in XP-compatibility mode
#endif