首页 > 代码库 > stl源码剖析:编译器的预定义位置集设置
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:预定义命令是否影响?
结果:我尝试了一下使用不同的预定义,但是没任何变化。
结论:增加自定义的位置集,即可替换对应库。而设计库的时候要使用无歧义路径才是兼容程序员用户使用自定义的组件替代默认库提供的组件。
求评论,好或坏。请支持正版链接。
stl源码剖析:编译器的预定义位置集设置