2012-03-14 9 views
3

Я работаю в Visual Studio, но мой проект предназначен для среды на основе POSIX (marmalade sdk). В этом проекте релиз сборка скомпилирован с gcc для ARM, но версия отладки работает в Windows и компилируется MS-компилятором. Также эта среда имеет собственную реализацию STL и других стандартных библиотек.Как определить неопределенность _MSC_VER?

Многих из этих C++ librares имеет такой код:

#if defined(_MSC_VER) 
    #include <Windows.h> 
#else 
    #include <pthread.h> 
#endif 

Можно ли указаный _MSC_VER макрос? - Чтобы библиотеки C++ обнаруживали систему POSIX здесь.

+1

'_MSC_VER' определяется только при компиляции с компилятором Visual Studio C++. Если вы используете какой-либо другой компилятор, он не будет определен. –

+0

Да, он компилируется с помощью компилятора Visual Studio C++, но не использует никаких оконных библиотек, таких как Windows.h - это не так. Мой вопрос о том, как рассказать компилятору, что не является стандартной средой Windows. – strobe

+1

вам может быть лучше, если использовать конструкцию, основанную на построении, например '_WIN32',' _MSC_VER', скорее всего, будет невозможно определить, поскольку его встроенный компилятор – Necrolis

ответ

2

Конечно:

#undef _MSC_VER 

#if defined(_MSC_VER) 
    #include <Windows.h> 
#else 
    #include <pthread.h> 
#endif 

Или #undef его, прежде чем включить файл, где _MSC_VER используется.

+0

Спасибо. Я попытался определить его на глобальном уровне проекта, но это не приводит к результату. – strobe

+1

@strobe: если файл abc.h содержит '#if defined (_MSC_VER)' и abc.cpp #includes abc.h, попробуйте '#undef _MSC_VER', а затем' #include abc.h'. – Donotalo

4

_MSC_VER определяется (и всегда должен быть) при компиляции с компилятором Microsoft, чтобы он «оценивал основные и младшие номера компонента номера версии компилятора». Поэтому код использует неправильный макро тест, так как он всегда будет определен для некоторого значения для вашего компилятора независимо от различий в среде Windows.

Вместо того, чтобы уничтожить определение _MSC_VER (что может привести к другим проблемам, если какой-либо код действительно хочет знать версию компилятора), вам действительно нужно исправить условие, чтобы более подходящий макропроцессор который различает типы среды Windows, с которыми вы можете столкнуться.

См. Более полный список предопределенных макросов, которые вы можете рассмотреть здесь.

http://msdn.microsoft.com/en-us/library/vstudio/b0084kay.aspx

Вы можете либо заменить условие ...

#if someOtherConditionGoesHere

... или расширить его с дополнительными условиями, например,

#if определен (_MSC_VER) & & someOtherConditionGoesHere

Смежные вопросы