Visual Studio: Как использовать набор инструментов платформы в качестве директивы препроцессора?

У меня есть два набора инструментов для платформы: 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 ++

8

Решение

Идти к 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.

7

Другие решения

Для VS 2012/2013, если вы используете набор инструментов обратной совместимости, _USING_V110_SDK71_ будет доступен для использования. VS2013 будет определять одно и то же имя независимо от имени набора инструментов платформы, которое является v120_xp.

#if (_MSC_VER >= 1700) && defined(_USING_V110_SDK71_)
// working in XP-compatibility mode
#endif
4

По вопросам рекламы [email protected]