【问题标题】:how to undefine _MSC_VER?如何取消定义_MSC_VER?
【发布时间】:2012-03-14 06:34:49
【问题描述】:

我在 Visual Studio 中工作,但我的项目适用于基于 POSIX 的环境(marmalade sdk)。在这个项目中,发布 build 使用 gcc for ARM 编译,但调试版本适用于 windows 并由 MS 编译器编译。此外,这个环境有自己的 STL 和其他标准库的实现。

其中许多 c++ 库都有这样的代码:

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

是否可以取消定义 _MSC_VER 宏? - 这样 C++ 库就会在这里检测到 POSIX 系统。

【问题讨论】:

  • _MSC_VER 仅在使用 Visual Studio C++ 编译器编译时定义。如果您使用任何其他编译器,它将不会被定义。
  • 是的,它使用 Visual Studio C++ 编译器进行编译,但环境不使用任何 Windows 库,如 Windows.h - 它没有。关于如何告诉编译器不是标准 Windows 环境的问题。
  • 使用像_WIN32 这样的基于构建的定义可能会更好,_MSC_VER 很可能无法取消定义,因为它是一个内置的编译器
  • _MSC_VER 旨在显示使用了哪个编译器。它没有说明构建环境。所以你应该只使用不同的微距

标签: c++ visual-studio visual-c++ marmalade


【解决方案1】:

_MSC_VER 在使用 Microsoft 编译器进行编译时(并且始终应该)被定义,以便它“评估编译器版本号的主要和次要数字组件”。因此,代码使用了错误的宏测试,因为无论 Windows 环境差异如何,它总是会为您的编译器定义为某个值。

与其破坏_MSC_VER 的定义(如果任何代码确实想知道编译器版本,这可能会导致其他问题),您真正应该做的是更正条件,以便进行更合适的宏测试用于区分您可能遇到的各种 Windows 环境。

查看更完整的预定义宏列表,您可以考虑here

您可以替换条件...

#if someOtherConditionGoesHere

...或用附加条件扩展它,例如

#if defined(_MSC_VER) && someOtherConditionGoesHere

【讨论】:

    【解决方案2】:

    当然:

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

    或者,在包含使用_MSC_VER 的文件之前#undef 它。

    【讨论】:

    • 谢谢。我试图在全局项目级别取消定义它,但这不会产生结果。
    • @strobe: 如果 abc.h 文件包含#if defined( _MSC_VER ) 和 abc.cpp #includes abc.h,那么请尝试#undef _MSC_VER 然后#include abc.h。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2015-11-04
    相关资源
    最近更新 更多