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:预定义命令是否影响?

结果:我尝试了一下使用不同的预定义,但是没任何变化。

结论:增加自定义的位置集,即可替换对应库。而设计库的时候要使用无歧义路径才是兼容程序员用户使用自定义的组件替代默认库提供的组件。

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

时间: 2024-12-16 10:20:31

stl源码剖析:编译器的预定义位置集设置的相关文章

《STL源码剖析》---stl_iterator.h阅读笔记

STL设计的中心思想是将容器(container)和算法(algorithm)分开,迭代器是容器(container)和算法(algorithm)之间的桥梁. 迭代器可以如下定义:提供一种方法,能够依序寻访某个容器内的所有元素,而又无需暴露该容器的内部表达方式. 在阅读代码之前,要先了解一个新概念:Traits编程技法 template <class T> struct MyIter { typedef T value_type //内嵌型别声明 T *ptr; MyIter(T *p = 0

STL&quot;源码&quot;剖析-重点知识总结

STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Containers):各种数据结构,如:vector.list.deque.set.map.用来存放数据.从实现的角度来看,STL容器是一种class template. 算法(algorithms):各种常用算法,如:sort.search.copy.erase.从实现的角度来看,STL算法

C++ 《STL源码剖析》学习-vector

本文章是笔者学习<STL源码剖析>的学习笔记,记录的是笔者的个人理解,因为个人的水平有限,难免会有理解不当的地方,而且该书出版的时间比较久,难免会有些不一样.如有不当,欢迎指出. vector是c++中经常用到的数据结构,而且在面试时也会有提及,因此了解vector很重要. 一说到vector,我们就很容易想到另外一个与它十分相似的数据结构,关于它们之间显著的差别,我觉得是在于空间运用的灵活性上.数组是静态的,在声明的时候就要指明其具体的空间大小,而vector是动态的,随着元素的增加,它内部

《STL源码剖析》---stl_alloc.h阅读笔记

这一节是讲空间的配置与释放,但不涉及对象的构造和析构,只是讲解对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本的STL对空间的的申请和释放做了如下考虑: 1.向堆申请空间 2.考虑了多线程.但是这节目的只是讲解空间配置与释放,因此忽略了多线程,集中学习空间的申请和释放. 3.内存不足时的应变措施 4.考虑到了内存碎片的问题.多次申请释放小块内存可能会造成内存碎片. 在C++中,内存的申请和释放是通过operator new函数和operator delete函数,这两个函数相当于C语

STL 源码剖析 stl_numeric.h -- copy

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie copy //唯一对外接口 /*-------------------------------------------------------------------------------------- * copy 函数及其重载形式 */ //完全泛化版本. template<class InputIterator, class OutputIterator> // ? 这里的 In

《STL源码剖析》---stl_deque.h阅读笔记(2)

看完,<STL源码剖析>---stl_deque.h阅读笔记(1)后,再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation fo

《STL源码剖析》---stl_list.h阅读笔记

STL中链表list是一个常用的容器.list在内存中是不连续的双向链表,且是环形的.要了解链表细节是如何操作的话,阅读STL关于链表的代码是最好的方法. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_list.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this

《STL源码剖析》学习之traits编程

侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器,知道了不同的数据结构都有自己专属的迭代器,不同的迭代器也有不同的特性,由于算法的接口是统一的,通过迭代器的不同属性,算法自动选择正确的执行流程,在完全任务的同时,也尽可能提高算法的执行效率.那算法如何获知迭代器的属性呢?这一光荣的任务就是traits完成的.在STL实现中,traits编程技术得到大量的运用

[转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依序巡防某个聚合物(容 器)所含的元素,而又无需暴露该聚合物的内部表达式.可见她的主要作用便是能够降低耦合,提高代码的 模块性. STL的的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们撮合 在一起,这贴胶着剂便是迭代器.迭代器的行为类似智能指针(例如标准库的auto_pt