您的位置:首页 > 编程语言

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

2016-02-04 13:40 246 查看
眼下我的工作环境还是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:提前定义命令是否影响?

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

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

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

求评论。好或坏。请支持正版链接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: