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源代码剖析:编译器的提前定义位置集设置的更多相关文章
- 《STL源代码剖析》---stl_deque.h阅读笔记(2)
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
- STL源代码剖析——STL算法stl_algo.h
前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法.本文剖析STL其它的算法,比如排序算法.合并算法.查找算法等等.在剖析的时候.会针对函数给出一些样例说明函数的使用.源代码出自SG ...
- STL源代码剖析——基本算法stl_algobase.h
前言 在STL中.算法是常常被使用的,算法在整个STL中起到很关键的数据.本节介绍的是一些基本算法,包括equal.fill.fill_n,iter_swap.lexicographical_comp ...
- STL源代码剖析——STL算法之set集合算法
前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...
- STL源代码剖析(二) - 迭代器与traits技法
提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterato ...
- STL源代码剖析(一) - 内存分配
Allocaor allocator 指的是空间配置器,用于分配内存.STL中默认使用SGI STL alloc作为STL的内存分配器,尽管未能符合标准规格,但效率上更好.SGI STL也定义有一个符 ...
- STL源代码剖析 读书总结
<<STL源代码剖析>> 侯捷著 非常早就买了这本书, 一直没看, 如今在实验室师兄代码的时候发现里面使用了大量泛型编程的内容, 让我有了先看看这本书的想法. 看之前我对于泛型 ...
- 《STL源代码剖析》---stl_alloc.h阅读笔记
这一节是讲空间的配置与释放,但不涉及对象的构造和析构,仅仅是解说对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本号的STL对空间的的申请和释放做了例如以下考虑: 1.向堆申请空间 2.考虑 ...
- STL源代码剖析 容器 stl_list.h
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie list ----------------------------------------- ...
随机推荐
- C++ 变量的声明与定义的区别
变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点 ...
- jquery自动识别输入的都是数字
//自动判断输入的书否为正整数 function wds_purchase_keyup(t) { var val = $(t).val(); -]+$/.test(val) && va ...
- Mac OS X 下 TAR.GZ 方式安装 MySQL 5.7+
方法: http://www.widlabs.com/article/mac-os-x-install-mysql-57-with-tar-gz mysql下载地址:http://www.mysq ...
- highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度
highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度 作者:highcharts | 时间:2014-6-11 14:07:05 | [小 大] | ...
- fitnesse 中各类fit fixture的python实现
虽然网上都说slim效率很高,无奈找不到支持python的方法,继续用pyfit 1 Column Fixture 特点:行表格展现形式,一条测试用例对应一行数据 Wiki !define COMMA ...
- javascript 作用域链
最近想整理一下js执行代码的一些知识,如果有出错的地方还请指正. 执行环境(Execution Context) 所有的javascript代码都是在一个执行环境中被执行的.它只是一种机制,用来完成运 ...
- 堆排序(java实现)
public class Test04 { static int a[] = {9,8,7,6,5,4,3,2,1,11,12,10,19,18,17,16}; public static void ...
- Bootstrap Collapse使用
参考 http://wrongwaycn.github.io/bootstrap/docs/javascript.html#collapse http://www.w3resource.com/twi ...
- Mysql5.6.24 zip解压缩版配置及修改默认编码方法
win64位下载地址: http://dev.mysql.com/downloads/file.php?id=456319 下载完毕后解压 配置环境变量 在Path后加上mysql解压后bin文件夹所 ...
- break 与continue的区别
//break是结束整个循环体,continue是结束单次循环 比方说: while(x++ < 10){ if(x == 3) { break; } printf("%d\r\n&q ...