不同版本VC++间相互调用的坑:标准库

某些时候不同项目或合作方使用不同的VS版本编译组件代码,如dll、静态库,此时涉及高版本VS调用低版本VS的组件或者低版本VS调用高版本VS的组件,如果在组件接口中使用了标准库,那么就会产生各种离奇古怪的BUG。
例如在dll的接口函数中通过std::vector、std::string作为形参,这是不可取的,应该改用内建变量,常用的解决方案是先将标准库的数据结构转换为二进制流,以指针的形式传递,这个过程也称为序列化,那么在调用dll的地方就需要反序列化,即把二进制流恢复成标准库的形式。
根本原因是不同版本VS下,标准库的实现代码是不一样的,其实不仅是标准库,C++的协议都会不一样,如VS2015对C++11的支持就比VS2013要更加全面。这些都会导致代码之间有不兼容的地方,开发过程中要非常注意。
以std::vector为例,VS2013的源码在

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\vector

VS2015的源码在

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\vector

以std::vector::clear为例,比较VS2013和VS2015的区别
VS2013

...
	_Vector_val()
		{	// initialize values
		_Myfirst = pointer();
		_Mylast = pointer();
		_Myend = pointer();
		}

	pointer _Myfirst;	// pointer to beginning of array
	pointer _Mylast;	// pointer to current end of sequence
	pointer _Myend;	// pointer to end of array
...
	void clear() _NOEXCEPT
		{	// erase all
		this->_Orphan_all();
		_Destroy(this->_Myfirst, this->_Mylast);
		this->_Mylast = this->_Myfirst;
		}		

VS2015

...
	pointer& _Myfirst() _NOEXCEPT
		{	// return reference to _Myfirst
		return (_Get_data()._Myfirst);
		}
...
	void clear() _NOEXCEPT
		{	// erase all
		this->_Orphan_all();
		_Destroy(this->_Myfirst(), this->_Mylast());
		this->_Mylast() = this->_Myfirst();
		}

vector的源代码是有很大的差异的

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值