stl源代码剖析:编译器的提前定义位置集设置

简介:

眼下我的工作环境还是win。全部演示也用VS或者cygwin这些环境作为基础。

1、配置项目的附加include目,添加提前定义位置集设置,编译器会把它添加include路径,比方在某个目录中定义一个vector(不带后缀),当我们项目中使用#include<>时。能够搜索到两个vector。分别为自己定义和系统自带的C++ stl中的。可是实际项目编译的时候会发现,自己定义的提前定义位置集的文件具有高优先级。简单点理解就是在出现路径歧义的情况下自己定义的会覆盖掉stl标准库。

猜想1:假设提前定义位置集中所添加的不同路径中有两个同样的文件,include採用的是有歧义形式的方式。即不附带完整路径,使用的是哪个文件?

測试结果:VS编译使用的是路径1中的。

其它编译器仍要又一次測试一遍,比方gcc 4.8.3。 待续。


猜想2:假设提前定义位置集中所添加的不同路径中有两个同样的文件,include採用的是有非歧义形式的方式,即附带完整路径#include<test/vector>,是否能同一时候使用的是两个文件?或者说使用的是哪个文件?

測试结果:VS编译使用的是路径1中的。其它编译器仍要又一次測试一遍,比方gcc 4.8.3。 待续。。


编译结果:

1>------ 已启动生成: 项目: TestSizeofBits, 配置: Debug Win32 ------
1>  stdafx.cpp
1>  TestSizeofBits.cpp
1>d:\cpp_lab\testsizeofbits\include4\ok\vector(4): error C2084: 函数“void print(void)”已有主体
1>          d:\cpp_lab\testsizeofbits\include3\include\vector(3) : 參见“print”的前一个定义
1>d:\cpp_lab\testsizeofbits\testsizeofbits\testsizeofbits.cpp(151): error C3861: “print”: 找不到标识符
1>  testNamespace.cpp
1>  正在生成代码...
========== 生成: 成功 0 个。失败 1 个,最新 0 个。跳过 0 个 ==========

也就是说VS编译器是识别非歧义的两个文件,出现了命名冲突。当我通过命名空间处理了两个文件的冲突后,VS就能够正确地识别两个文件的内容。并完毕链接。


为什么我要測试这些?由于我想把sgi_stl或者boost等库的内容引入个人的文件里。可是会出现同名冲突。而仅仅要处理好路径和命名空间中。就能够正确地使用自己定义的同名库。

//vector

#pragma once
#include <iostream>
void print3()
{
	std::cout<<"jingz;s vector3"<<std::endl;
}


#include <include/vector>
#include <ok/vector>
#include <vector>


print3();

	print4();

	vector<int> arrInt(10);

	arrInt[0] = 1;

	cout<<arrInt[0]<<endl;

測试程序正确执行。


猜想3:提前定义命令是否影响?

结果:我尝试了一下使用不同的提前定义,可是没不论什么变化。


结论:添加自己定义的位置集,就可以替换相应库。

而设计库的时候要使用无歧义路径才是兼容程序猿用户使用自己定义的组件替代默认库提供的组件。

求评论。好或坏。请支持正版链接。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5181418.html,如需转载请自行联系原作者

相关文章
|
监控 Go
Golang 语言 beego v2 之路由设置
Golang 语言 beego v2 之路由设置
415 0
|
Kubernetes 测试技术 数据库
详解微服务应用灰度发布最佳实践
相对于传统软件研发,微服务架构下典型的需求交付最大的区别在于有了能够小范围真实验证的机制,且交付单位较小,风险可控,灰度发布可以弥补线下测试的不足。本文从 DevOps 视角概述灰度发布实践,介绍如何将灰度发布与 DevOps 工作融合,快来了解吧~
33015 19
|
前端开发 数据库 云计算
技术运营的工作是什么?
技术运营的工作是什么?
738 0
|
网络协议 编译器 Go
玩转gRPC—深入概念与原理
玩转gRPC—深入概念与原理
|
存储 算法 计算机视觉
使用Roberts算子进行图像分割(Matlab自编程实现)
使用Roberts算子进行图像分割(Matlab自编程实现)
516 0
使用Roberts算子进行图像分割(Matlab自编程实现)
|
存储 前端开发 编译器
|
机器学习/深度学习 人工智能 关系型数据库
MySQL中 PK NN UQ BIN UN ZF AI 的意思
PK   Belongs to primary key作为主键 NN   Not Null非空 UQ  Unique index不能重复 BIN  Is binary column存放二进制数据的列 UN  Unsigned data type无符号数据类型(需要整数形数据) ZF  Fi...
2405 0