1、C++包含头文件中<>和""的区别
#include “book.h”
#include<iostream.h>
include<XX.h>表示在标准库里面(不用加绝对路径)
include"..\XX.h"表示在指定文件中(需要加路径(绝对或相对都行),本例是只在本级目录的上一级查XX.h)
include"..\XX.h"表示在指定文件中(需要加路径(绝对或相对都行),本例是只在本级目录的上一级查XX.h)
<>和""表示编译器在搜索头文件时的顺序不同,<>表示从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录,""是表示从当前目录开始搜索,然后是系统目录和PATH环境变量所列出的目录。
所以,系统头文件一般用<>,用户自己定义的则可以使用"",加快搜索速度
2、带<.h>和不带<.h>的头文件的区别
#include <iostream.h>
#include <fstream.h>
using namespace std;
using namespace std;
在以上边的方式定义了头文件后,如果在程序中创建如:
ofstream file
对象的时候编译是会产生如下错误:
'ofstream':ambiguous symbol
这是二义性错误
以下是正确用法和区别:
现在来看看下面两个include:
#include<iostream> // 这个就是1998年标准化以后的标准头文件
#include<iostream.h> // 这个就是标准化以前的头文件
更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的iostream.h则将这些标准组件放在全局空间里,同时在标准化以后旧有的C标准库也已经经过改造了。使用前者,就需要在代码中添加语句:using namespace std;
看看下面这两个头文件
// 标准化后经过改造的C的标准库,所有的组件都放在了std中
#include<cstdio>
// 标准化以前C++中的C标准库
#include<stdio.h>
// 在看看这个头文件C标准库下基于char* 的字符处理函数库
#include<string.h>
// 在标准化以后他变成了这样
#include<cstring>
// 但是很多朋友还看见过这个字符串处理函数库,他包含了新的string class
#include<string>
经过了标准委员会如此大规模手术后,在98年以前出品的C++编译器(BC3.0,BC5.0)上能顺利通过编译的源文件,在支持新标准的编译器上可能无法顺利通过编译也就是很正常的事了。
[起因
在回过头来看看标准程序库,这个程序库涵盖范围相当广大,提过了许许多多好用的功能。正是因为这样标准程序库中class的名称和函数名与第三方提供的程序库中的class名或是函数名发生名字冲突的可能性大大增大。为了避免这个问题的发生,标准委员会决定将标准程序库中每一样东西都放在namespace std中。但是这么做同时有引来了一个新的问题。很多C++程序代码依赖那些已经存在很多年的C++ “准”标准程序库(C++迟迟未标准化才导致这些情况的发生),例如iosteam.h,complex.h等等。
为了解决这个新出现的问题,标准化委员会决定设计一些新的头文件名,给那些穿上std外衣的组件所使用。把C++头文件的.h去掉,于是就有前面出现的iostream,同样C的头文件也做了相同的处理,同时在前面加上了一个字母c,以表示是C的头文件(感觉上有中种族歧视的感觉)。同时标准化委员会声明就有的C++头文件将不再列于被支持的名单之中了,而旧有的C头文件为了满足“对C的兼容性”这个古老契约,仍然将继续存活下去。
但是,那些编译器厂商不可能去推翻他们客户的旧有编译器(也跟本不会去这么做),所以那些旧有的C++头文件仍然苟延残喘的活了下来,并不断的扰乱那些C++新兵的心智。
下面就是现在大多数C++开发工具表示头文件的组织状态:
1. 旧的C++头文件比如iostream.h,他们虽然被标准化委员会所抛弃,但由于各大厂商为了各自的商业利益仍然将继续存活下去,这些头文件的内容将不处于namespace std中。
2. 新的C++头文件如iostream虽然提供了和旧有头文件相同的功能,但他的内容都并入了namespace std中,从而有效避免了名字污染的问题。
3. 标准C的头文件如stdio.h继续获得支持,这类文件的内容并未放在std中。
4. C函数库的技能也有对应的新式C++版本,起名称类似cstdio,这类头文件的内容也有幸穿上了std的外衣。
其实标准化以后的标准程序库的改动并不只有这些而已,很多的标准化组件都被“tamplate化”。其中就有元老级人物iostream。标准程序库的问题并不是用一篇,两篇文章就可以说清楚的。如果你像进一步的了解C++的标准程序库的话,你可以看看侯先生的《C++标准程序库》。
如果用了<iostream>,则一定要引入命名空间,即"using namespace std;".
如果用了<iostream.h>,则不那引入命名空间,否则会引起编译错误,提示
不到命名空间,例程如下:
//情况一:使用<iostream>和命名空间
#include <iostream>
using namespace std;
int main()
{
如果用了<iostream.h>,则不那引入命名空间,否则会引起编译错误,提示
不到命名空间,例程如下:
//情况一:使用<iostream>和命名空间
#include <iostream>
using namespace std;
int main()
{
cout<<"<iostream> need to use namespace std!/n";
return 0;
}
输出:
<iostream> need to use namespace std!
Press any key to continue
//情况二:使用<iostream.h>,不引入命名空间
#include <iostream.h>
//using namespace std;
intmain()
{
cout<<"<iostream> need to use namespace std!/n";
return 0;
}
输出:
return 0;
}
输出:
<iostream> need to use namespace std!
Press any key to continue
//情况二:使用<iostream.h>,不引入命名空间
#include <iostream.h>
//using namespace std;
intmain()
{
cout<<"<iostream> need to use namespace std!/n";
return 0;
}
输出:
<iostream> need to use namespace std!
Press any key to continue
//情况三:使用<iostream.h>,引入命名空间,这时候编译出错
#include <iostream.h>
using namespace std;
intmain()
{
cout<<"<iostream> need to use namespace std!/n";
return 0;
}
编译错误信息:
error C2871: 'std' : does not exist or is not a namespace
Press any key to continue
//情况三:使用<iostream.h>,引入命名空间,这时候编译出错
#include <iostream.h>
using namespace std;
intmain()
{
cout<<"<iostream> need to use namespace std!/n";
return 0;
}
编译错误信息:
error C2871: 'std' : does not exist or is not a namespace
从 Visual C++ .NET 2003 开始,移除了旧的iostream库。
标准 C++ 库和以前的运行时库之间的主要差异在于iostream库。iostream实现的具体细节已经更改,如果想链接标准 C++ 库,可能有必要重写代码中使用iostream的部分。
标准 C++ 库和以前的运行时库之间的主要差异在于iostream库。iostream实现的具体细节已经更改,如果想链接标准 C++ 库,可能有必要重写代码中使用iostream的部分。
必须移除任何包含在代码中的旧iostream头文件(fstream.h、iomanip.h、iOS.h、iostream.h、istream.h、ostream.h、streamb.h和strstrea.h),并添加一个或多个新的标准 C++ iostream头文件(<fstream>、<iomanip>、<ios>、<iosfwd>、<iostream>、<istream>、<ostream>、<sstream>、<streambuf>和<strstream>,所有头文件都没有 .h 扩展名)。
下表描述新的标准 C++ iostream库不同于旧iostream库的行为。
在新的标准 C++ iostream库中:
open 函数不采用第三个参数(保护参数)。
无法从文件句柄创建流。
除了几个例外,新的标准 C++ 库中的所有名称都在std命名空间中。有关更多信息,请参见使用 C++ 库头。
单独用ios::out 标志无法打开ofstream对象。ios::out 标志必须在逻辑 OR 中和另一个ios枚举数组合;比如,和ios::in 或ios::app 组合。
因为设置了eofbit状态,到达文件尾后ios::good 不再返回非零值。
除非知道当前没有设置基标志,否则ios::setf(_IFlags) 不应和ios::dec、ios::oct或ios::hex 的
下表描述新的标准 C++ iostream库不同于旧iostream库的行为。
在新的标准 C++ iostream库中:
open 函数不采用第三个参数(保护参数)。
无法从文件句柄创建流。
除了几个例外,新的标准 C++ 库中的所有名称都在std命名空间中。有关更多信息,请参见使用 C++ 库头。
单独用ios::out 标志无法打开ofstream对象。ios::out 标志必须在逻辑 OR 中和另一个ios枚举数组合;比如,和ios::in 或ios::app 组合。
因为设置了eofbit状态,到达文件尾后ios::good 不再返回非零值。
除非知道当前没有设置基标志,否则ios::setf(_IFlags) 不应和ios::dec、ios::oct或ios::hex 的
标志值一起使用。格式化的输入/输出函数和运算符假定只设置了一个基。改用ios_base。例如,setf( ios_base::oct, ios_base::basefield ) 清除所有基信息并将基设置成八进制。
ios::unsetf返回 void 而不是以前的值。
若出现错误,istream::get( char& _Rch ) 不分配给Rch。
istream::get( char* _Pch, int _Ncount, char _Delim ) 有三点不同:
没读取任何内容时设置failbit。
提取的字符后总是存储一个eos(与结果无关)。
值为 -1 时 _Ncount是一个错误。 字符串函数的头文件
具有无效参数的istream::seekg不设置failbit。
返回类型streampos是具有重载运算符的类。在返回streampos值(比如istream::tellg、ostream::tellp、strstreambuf::seekoff和strstreambuf::seekpos)的函数中,应将返回值转换成所需的类型:streamoff、fpos_t或mbstate_t。
strstreambuf::strstreambuf( _Falloc, _Ffree ) 中的第一个函数参数采用size_t参数而不是 long。
除了上述改动外,以下作为旧iostream库元素的函数、常数和枚举数不是新iostream库的元
ios::unsetf返回 void 而不是以前的值。
若出现错误,istream::get( char& _Rch ) 不分配给Rch。
istream::get( char* _Pch, int _Ncount, char _Delim ) 有三点不同:
没读取任何内容时设置failbit。
提取的字符后总是存储一个eos(与结果无关)。
值为 -1 时 _Ncount是一个错误。 字符串函数的头文件
具有无效参数的istream::seekg不设置failbit。
返回类型streampos是具有重载运算符的类。在返回streampos值(比如istream::tellg、ostream::tellp、strstreambuf::seekoff和strstreambuf::seekpos)的函数中,应将返回值转换成所需的类型:streamoff、fpos_t或mbstate_t。
strstreambuf::strstreambuf( _Falloc, _Ffree ) 中的第一个函数参数采用size_t参数而不是 long。
除了上述改动外,以下作为旧iostream库元素的函数、常数和枚举数不是新iostream库的元
素:
filebuf、fstreamifstream和ofstream的 attach 成员函数
filebuf、fstreamifstream和ofstream的fd成员函数
filebuf::openprot
filebuf::setmode
ios::bitalloc
ios::nocreate
ios::noreplace
ios::sync_with_stdio
streambuf::out_waiting
streambuf::setbuf(相同的行为使用rdbuf ->pubsetbuf)
filebuf、fstreamifstream和ofstream的 attach 成员函数
filebuf、fstreamifstream和ofstream的fd成员函数
filebuf::openprot
filebuf::setmode
ios::bitalloc
ios::nocreate
ios::noreplace
ios::sync_with_stdio
streambuf::out_waiting
streambuf::setbuf(相同的行为使用rdbuf ->pubsetbuf)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论