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 ----------------------------------------- ...
随机推荐
- VS2015自定义注释内容
一直想自动添加一些注释信息,找了好多种方式:各种插件什么的,最后偶然发现可以修改vs的模板可以做到,下面介绍如何改 首先找到vs的安装目录,如下是我的安装目录: D:\Program Files\VS ...
- HDU 1695 GCD(欧拉函数+容斥原理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, ...
- 删除Lb重复的数,用La输出(顺序表)
#include<stdio.h> typedef int A; const int LIST_INIT_SIZE=100; const int LISTINCRMENT=10; type ...
- iOS自动自动隐藏软键盘
自动隐藏软键盘,分为两步,一个是单击软键盘外部任意空间:另外一个是单击软键盘上的return键.下面依次实现 单击软键盘外部空间键隐藏软键盘: 一:在viewDidLoad中添加一个UITabGest ...
- A Byte of Python 笔记(2)基本概念:数、字符串、转义符、变量、标识符命名、数据类型、对象
第4章 基本概念 字面意义上的常量 如5.1.23.9.23e-3,或者 'This is a string'."It's a string!" 字符串等 常量,不能改变它的值 数 ...
- python自学笔记(十)语句与数据结构应用
1.最基本的迭代 for x in y 2.如何迭代字典 for x,y in a.items(): print:x,y 3.如何为字典排序 key_list = a.keys() key_list. ...
- Maven本地
<localRepository></localRepository>
- 导入jsp
<%@ page contentType="text/html;charset=UTF-8" %><%@ page isELIgnored="false ...
- Spring Boot 属性配置和使用
Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...
- 让Apache支持中文Directory的最简方法
解决方法很简单,一句话,将httpd.conf配置文件的字符编码转换成UTF-8即可. 转换方法也很简单,在记事本中选择 文件->另存为,弹出的窗口中选择编码为UTF-8即可. 重新启动下apa ...