3

I work in Visual Studio but my project is for a POSIX-based environment (marmalade sdk). In this project, the release build is compiled with gcc for ARM but the debug version works on windows and is compiled by MS compiler. Also this environmet has its own implementation of STL and other standard libraries.

Many of these c++ librares have code like this:

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

Is it possible to undefine the _MSC_VER macro? - So that the C++ libraries will detect a POSIX system here.

peterchen
  • 40,917
  • 20
  • 104
  • 186
strobe
  • 519
  • 2
  • 5
  • 21
  • 1
    `_MSC_VER` is only defined when compiling with the Visual Studio C++ compiler. If you use any other compiler it will not be defined. – Some programmer dude Mar 14 '12 at 06:54
  • Yes, it compiling with the Visual Studio C++ compiler but enviroument not use any windows librares like Windows.h - it's don'have it. My qestion about how to tell to compiler that is not standart windows environment. – strobe Mar 14 '12 at 07:01
  • 1
    you might be better served using a build based define like `_WIN32`, the `_MSC_VER` is mostly likely going to be impossible to undefine as its a compiler builtin – Necrolis Mar 14 '12 at 07:14
  • 2
    `_MSC_VER` is intended to show which *compiler* is used. It says nothing about the *build environment*. So you should just use a different mecro – jalf Mar 14 '12 at 09:15

2 Answers2

6

_MSC_VER is (and always should be) defined when compiling with the Microsoft compiler so that it "evaluates to the major and minor number components of the compiler's version number". Therefore, the code is using the wrong macro test, since it will always be defined to some value for your compiler regardless of the Windows environment differences.

Rather than destroy the definition of _MSC_VER (which could lead to other problems if any code really does want to know the compiler version), what you really should do instead is to correct the condition so that a more appropriate macro test is used that distinguishes between the kinds of Windows environments that you might encounter.

See the more complete list of predefined macros you could consider here

You could either replace the condition ...

#if someOtherConditionGoesHere

... or extend it with additional conditions, e.g.

#if defined(_MSC_VER) && someOtherConditionGoesHere
phuclv
  • 37,963
  • 15
  • 156
  • 475
Eso
  • 61
  • 1
  • 2
2

Of course:

#undef _MSC_VER

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

Or, #undef it before you include the file where _MSC_VER is used.

Donotalo
  • 12,748
  • 25
  • 83
  • 121
  • Thanks. I tried to undefine it at global project level but this not produce a result. – strobe Mar 14 '12 at 07:08
  • 1
    @strobe: if abc.h file contains `#if defined( _MSC_VER )` and abc.cpp #includes abc.h, then please try `#undef _MSC_VER` and then `#include abc.h`. – Donotalo Mar 14 '12 at 07:11