_MSC_VER的含义和链接库名称后边附加字母“d”

本文解析了在不同版本的微软编译器环境下,如何通过_MSC_VER宏来选择性链接不同的静态库文件。这对于确保跨版本编译器间的兼容性至关重要。
在配置红宝书第八版的时候看到头文件”vgl.h“有这样一段代码,含有_MSC_VER,glew_static_vs2010_d.lib和glew_static_vs2010.lib。
感觉不解,查资料后明白:
#ifdef _MSC_VER
#  ifdef _DEBUG
#    if (_MSC_VER >= 1600)
#      pragma comment (lib, "glew_static_vs2010_d.lib")
#    else
#      pragma comment (lib, "glew_static_d.lib")
#    endif
#  else
#    if (_MSC_VER >= 1600)
#      pragma comment (lib, "glew_static_vs2010.lib")
#    else
#      pragma comment (lib, "glew_static.lib")
#    endif
#  endif
#endif

1._MSC_VER表示微软编译器的版本

Microsoft Compiler Version 的缩写宏:_MSC_VER

其中:

VC++ 5.0   _MSC_VER = 1000

VC++ 6.0   MSC_VER=1200

VC++ 10.0   MSC_VER=1600


2.链接库后边附加“d”

当解决方案配置为“Debug”时 ,生成的链接库名称后边会附加“d”;


在程序中加入_MSC_VER宏可以根据 编译器版本让编译器选择性地编译一段程序。例如一个版本编译器产生的 lib文件可能不能被另一个版本的编译器调用,那么在开发应用程序的时候,在该程序的lib调用库中放入多个版本编译器产生的lib文件。在程序中加入_MSC_VER宏,编译器就能够在调用的时根据其版本自动选择可以链接的lib库版本,如下所示。
#if _MSC_VER >= 1400 // for vc8, or vc9
#pragma comment( lib, "SomeLib-vc8-d.lib" )
#elif
#pragma comment( lib, "SomeLib-vc8-r.lib" )
#elif _MSC_VER >= 1310 // for vc71
#pragma comment( lib, "SomeLib-vc71-d.lib" )
#elif
#pragma comment( lib, "SomeLib-vc71-r.lib" )
#elif _MSC_VER >=1200 // for vc6
#ifdef _DEBUG
#pragma comment( lib, "SomeLib-vc6-d.lib" )
#elif
#pragma comment( lib, "SomeLib-vc6-r.lib" )
#endif
#endif

  

<think> 嗯,用户想了解_MSC_VER含义,这个问题我在之前的回答中已经解释过,但用户再次询问,可能是想得到更清晰的说明或者之前没完全理解。 根据引用内容整理关键点:_MSC_VER是微软C/C++编译器的版本标识宏,由编译器自动定义。用户提供的引用[1][2]都强调它是"Microsoft Visual C++版本号"的缩写形式,引用[3]则给出了详细的版本映射表。 注意到用户特别标注"引用仅供参考",说明用户更想要我整合信息后的原创解释。考虑用更通俗的方式说明:就像软件有版本号,_MSC_VER就是VC++编译器的内置身份证号,开发者通过检查这个号码来决定启用哪些编译器专属功能。 用户引用中提到的条件编译场景很重要,准备在回答中强调这个实际用途。比如旧版VC++可能不支持C++11特性,开发者就可以写: ```cpp #if _MSC_VER >= 1700 // 在VS2012及以上版本使用新特性 #endif ``` 用户提供的版本对照表很完整,考虑保留它但有两点改进:1) 补充最新版本信息(查到VS2022对应1930+)2) 把表格内容转换为更易读的列表形式。另外考虑增加实用技巧,比如如何查看当前_MSC_VER值(通过printf输出或编译器选项)。 用户连续询问同一个概念,可能在开发中遇到了实际问题。考虑在相关问题里埋下钩子:性能优化兼容性处理都是开发者常遇到的痛点。 </think> `_MSC_VER` 是 **Microsoft Visual C++ 编译器定义的宏**,用于标识当前编译器的具体版本号。其核心含义应用如下: --- ### 含义解析 1. **名称构成** - `MS`:Microsoft(微软) - `C`:C/C++ 编译器 - `VER`:Version(版本号) **本质**:`_MSC_VER` 是一个整数值,代表微软编译器(MSVC)的版本。 2. **核心作用** - **条件编译**:通过预处理器指令(如 `#if _MSC_VER > 1000`)检查编译器版本,决定是否包含特定代码。 - **兼容性控制**:不同版本编译器对C/C++标准的支持存在差异(如C++11/14/17特性),需用此宏适配新旧环境[^1][^2]。 3. **版本映射表** | `_MSC_VER` 值 | 编译器版本 | Visual Studio 版本 | |---------------|--------------------|---------------------| | 1930+ | MSVC++ 17.0 | VS 2022 | | 1920+ | MSVC++ 16.0 | VS 2019 | | 1910+ | MSVC++ 15.0 | VS 2017 | | **1900** | MSVC++ 14.0 | **VS 2015** | | 1800 | MSVC++ 12.0 | VS 2013 | | 1700 | MSVC++ 11.0 | VS 2012 | | 1600 | MSVC++ 10.0 | VS 2010 | | ... | ... | ... | > 注:完整映射见引用[^3]。 --- ### 典型使用场景 ```cpp // 检查编译器是否支持C++11 #if _MSC_VER >= 1700 // VS2012+ #include <thread> // 使用C++11线程库 #else #error "需要VS2012或更高版本" #endif // 避免旧版本编译器中的BUG #if _MSC_VER < 1920 // VS2019之前 #pragma warning(disable:4996) // 禁用安全警告 #endif ``` --- ### 相关问题 1. **如何查看当前项目的 `_MSC_VER` 值?** (提示:通过编译器日志或代码打印 `printf("%d", _MSC_VER);`) 2. **`_MSC_VER` `_MSVC_LANG` 宏有何区别?** (提示:后者标识编译器支持的C++标准版本,如C++17/20) 3. **跨平台开发中如何处理 `_MSC_VER`?** (提示:需配合 `#ifdef _MSC_VER` 隔离Windows专属代码) 4. **为什么微软不直接使用年份作为版本号?** (提示:历史兼容性需求,`_MSC_VER` 是编译器的内部标识) [^1]: 用于编译器版本的条件编译控制 [^2]: 宏名称的语义拆解(Microsoft C Version) [^3]: 版本号与Visual Studio版本的映射关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值