0. 序言

<iostream.h>与<iostream>这两个库就是C++ 标准化前/后的两个库,现在都在并行使用。用 .h 包含的是C++ 标准化之前的库 ,不带 .h 的是C++ 标准化(C++ 98)之后的头文件,对于普通用户来说这两者没有什么区别,区别是在内部函数的具体实现上。

#include <iostream.h>   //非标准输入输出流,这是标准化以前的头文件(当时还没有命名空间的概念)
#include <iostream>     //标准输入输出流,这个就是C++98标准化以后的标准头文件

1. C++发展概述

C++ 是一门以C为基础发展而来的一门面向对象的高级程序设计语言,从1983年由Bjarne Stroustrup教授在贝尔实验室创立开始至今,已有30多个年头。C++ 从最初的C with class,经历了从C++ 98、C++ 03、C++ 11、C++ 14再到C++ 17多次标准化改造,功能得到了极大的丰富,已经演变为一门集面向过程、面向对象、函数式、泛型和元编程等多种编程范式的复杂编程语言,入门具有一定的难度。

C++ 经历了长时间的发展演变。1954年,John Backus发明了世界上第一种计算机高级语言Fortran,为之后出现的高级编程语言奠定了基础。1970年,AT&T的Bell实验室的 Ken Thompson,以BCPL语言为基础,设计出简单且接近硬件的B语言(取BCPL的首字母),并且他用B语言写了第一个Unix操作系统。到了1972年,Bell实验室的Dennis Ritchie和Ken Thompson共同发明了C语言,并使用C重写Unix。1979年,Bjame Stroustrup到了Bell实验室,开始从事将C改良为带类的C(C with Classes)的工作,1983年该语言被正式命名为C++,主要意图是表明C++ 是C的增强版,1985年发布了第一个C++ 版本。

第一个版本的C++,因其面向对象的思想使得编程变得简单,并且又保持了C语言的运行效率,在推出的一段时间内,得到了快速的发展,占据了编程语言界的半壁江山。从1985年到1998年,C++从最初的C with Classes新增了很多其他的特性,比如异常处理、模板、标准模板库(STL)、运行时异常处理(RTTI)与名字空间(Namespace)等。

1998年,C++ 标准委员会统筹C++ 的所有特性,发布了第一个C++ 的国际标准:C++ 98

从1998年到2003年,C++ 标准从C++ 98迭代到C++ 03,期间C++ 扩增了很多额外的特性,比如以Boost MPL(Boost Metaprogramming Library)与Loki等为代表的模板元编程库的出现,让开发者更加便捷的使用C++在编译期的执行能力,即通过代码编译获得计算结果,学术性的称为模板元编程。

到了2003年,C++ 标准委员会总结最新技术并发布了C++ 03标准。

从2003年到2011年,也就是从C++ 03到C++ 11,期间C++ 引入了对象移动、右值引用、lamba表达式(函数式编程)、编译时类型识别(auto)、别名模板以及很多新型关键词(如nullptr、decltype、constexpr)等现代编程语言常具备的能力,让C++ 与时俱进,开发效率得到了很大的提升。这些新的特性随着C++ 11标准的发布而被正式确立下来。

近年来,C++ 标准的变更周期缩短,由C++ 11到C++ 14以及最近的C++ 17都只用了3年的时间。C++ 14引入了二进制文字常量、将类型推导从Lambda函数扩展到所有函数、变量模板以及数字分位符等。C++ 14 是对C++ 11的重要补充和优化,是C++ 发展历程中的一个小型版本,虽然新增的内容较少,但是仍然为用户“带来了极大的方便”,为实现使C++ “对新手更为友好”这一目标作出努力。到了2017年,C++ 迎来了C++ 17标准。此次对C++ 的改进和扩增,让C++ 变得更加容易接受和便于使用了。C++ 17引入了许多新的特性,比如类模板参数推导、UTF-8文字常量、fold表达式、新类型以及新的库函数等。

2. namespace(TODO)

C++ 标准程序库涵盖范围相当大,提供了大量功能,正因为这样,标准库中class名称和函数名与第三方提供的class和函数名冲突的可能性变大。为避免该冲突的发生,在标准化时特别引入了“名字空间的定义”,即namespace。将所有标准程序库中的东西都放在了namespace std中。

但是这么做同时有引来了一个新的问题。很多C++ 程序代码依赖那些已经存在很多年的C++ “准”标准程序库(C++迟迟未标准化才导致这些情况的发生),例如iosteam.h,complex.h等等。

3. 用法区别

为了解决这个新出现的问题,标准化委员会决定设计一些新的头文件名,给那些穿上std外衣的组件所使用。把C++ 头文件的.h去掉,于是就有前面出现的iostream,同样C的头文件也做了相同的处理,同时在前面加上了一个字母c,以表示是C的头文件(感觉上有种种族歧视的感觉)。

  非标准 标准
C输入输出标准库 #include<stdio.h> #include<cstdio>

同时标准化委员会声明就有的C++头文件将不再列于被支持的名单之中了,而旧有的C头文件为了满足“对C的兼容性”这个古老契约,仍然将继续存活下去。

当代码中用<iostream.h>时,这时头文件是C语言格式的,尚未出现namespace,输出可直接引用。

cout<<x;
//<iostream.h>继承C语言的标准库文件,未引入名字空间定义,所以可直接使用。

当代码中引入<iostream>时,为标准输入输出流,包含在std命名空间内,输出需要引用std命名空间。

std::cout<<x;

如果还是按原来的方法就会有错。

使用<iostream>时,引入std::有以下方法:

  1. 使用using编译指令引用整个命名空间。
using namespace std;    //all names available
cout << x ;

这个using编译指令使std这个命名空间中的所有名称都可用,这是一种懒惰的做法,在大型项目中有潜在问题。所以更好的做法是按需引用.

  1. 只列出所需的名称。
using std :: cout;  //make cout available
cout << x ;

3.基本引用

std::cout << x;

下面以完整程序,使用cout和endl举例说明。

3.1 iostream.h 的使用

iostream.h中函数都是全局的,使用的方法同C相同。

//example.cpp
#include <iostream.h>int main(void)
{cout<<"Hello World"<<endl;return 0;
}

上面的例子examplec.pp使用下面普通的方法编译,甚至提示找不到iostream.h这个头文件

# g++ example.cpp
error: iostream.h: No such file or directory
error: ‘cout’ was not declared in this scope
error: ‘endl’ was not declared in this scope

没有头文件怎么办呢?这需要安装兼容包,在我的64位系统安装了下面2个包(还有其他包)

# yum install compat-gcc*Install compat-gcc-34.x86_64
Install compat-gcc-34-c++.x86_64

记住上面包的名字中的数字34,在不同系统中可能是不同的,继续编译,注意这次使用的不是g而是g34.

# g++34example.cppIn file included from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/backward/iostream.h:31, from main.cpp:8: /usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.

这次编译有一个很长的warning,意思就是建议使用标准头文件不使用非标准头文件。

非要使用非标准头文件的时候可以通过添加编译选项-Wno-deprecated 来取消这个warning

# g++34 -g example.cpp -Wno-deprecated

OK,到此就编译成功了。

3.2 iostream 的使用

主要有3种方法,没有最优,只有最合适

方法1,适用于使用函数个数少,函数使用次数少 的情况

//example1.cpp
#include <iostream>int main(void)
{std::cout<<"Hello World"<<std::endl; //方法1return 0;
}

方法2,适用于使用函数个数少,函数使用次数较多 的情况

//example2.cpp
#include <iostream>
using std::cout;              //方法2
using std::endl;              //方法2int main(void)
{cout<<"Hello World"<<endl;return 0;
}

方法3,适用于使用函数个数和函数次数较多 的情况

//example3.cpp
#include <iostream>
using namespace std;            //方法3int main(void)
{cout<<"Hello World"<<endl;return 0;
}

3.3 建议

最好使用标准头文件。

iostream是现在C++ 中规定的标准,目的在于使C++ 代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改。

iostream包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应)。

一般情况下应该用这个头文件,而iostream.h则是老式的,以后有可能被淘汰。

4. 其他参考

string.h c标准库提供的字符串函数

string.h是C语言里面关于字符数组的函数定义的头文件,常用函数有strlen、strcmp、strcpy等等,更详细的信息可以自己查看(面向过程)。

cstring c标准库提供的字符串函数

CString常用于MFC编程中,是属于MFC的类,如从对话框中利用GetWindowText得到的字符串就是CString类型,CString定义在afx.h头文件中。CString为Visual C++ 中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,所以使用CString时要包含afx.h文件。

string c++标准库提供的string类

string是C++ 标准库(STL)中的类型,它是定义的一个类,定义在string头文件中。里面包含了对字符串的各种常用操作,它较char*的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作。

参考资料

  1. <iostream> 和 <iostream.h>的区别 及 Linux下编译iostream.h的方法
  2. C++ 发展概述
  3. C++ 的发展过程和历史
  4. C++ 元编程和Boost编程库 (C++ Metaprogramming and Boost MPL )上部
  5. #include<string.h>、#include<cstring>与#include<string>的区别
  6. 名字空间-维基百科
  7. C++ 名字空间/C++ 命名空间

C++中的iostream和iostream.h相关推荐

  1. 【C++】C++中的头文件(.h)—详解(1)

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 之前写过一篇<C++中头文件的使用>,那篇文章主要讲述C++中头文件的使用 ...

  2. C++中的头文件(.h)和源文件(.cc)

    头文件(,h): 写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等,但一般来说不写出具体实现. 在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句: #ifn ...

  3. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  4. 【C++】C++中的头文件(.h)—详解(2)

    接上... [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 头文件中写些什么 在上篇博客中写到头文件本身不参与编译,但是它们被包含到源文件中 ...

  5. c语言中的自己写的.h文件如何调用注意事项

    c语言中的自己写的.h文件如何调用注意事项 需要建立一个项目project,并把相关的.h .c .cpp文件建在这个项目下面. 需要注意引用时不同,例如 #include<stdio.h> ...

  6. c语言中的头文件stdlib.h的作用,C语言中你可能不熟悉的头文件(stdlib.h)

    C语言中你可能不熟悉的头文件(stdlib.h) C Standard General Utilities Library (header) C标准通用工具库(头文件) 此头文件定义了一些通用功能函数 ...

  7. 在源文件中没有找到用 /Ycstdafx.h 命令行选项指定的“#include”语句

    在源文件中没有找到用 /Ycstdafx.h 命令行选项指定的"#include"语句 http://bbs.csdn.net/topics/70396257

  8. linux内核中链表代码分析---list.h头文件分析(一)

    linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17:13:14 在学习数据结构时,有一个重要的知识点就是链表.对于链表的一些基本操作,它的最好学习资料就是内核中的li ...

  9. Linux中使用iOStream头文件,在Linux中使用gcc链接iostream.h

    我想在Linux(Linux MINT 8)中运行我的第一个C++程序.我使用gcc或g++,两者都有相同的问题:编译器找不到我要导入的库. 我怀疑我应该复制工作文件夹中的iostream.h文件(我 ...

  10. iostream与iostream.h乱弹琴

    #include <iostream.h> 非标准输出流 #include <iostream>    标准输出流 见短eclipse关于使用android ndk时的简单代码 ...

最新文章

  1. 总监路上的第 1 年,犯了两个小错误 | 程序员有话说
  2. 【408预推免复习】计算机组成原理之存储器
  3. CPU_X86架构和ARM架构入门篇
  4. 百度智能云人脸活体检测系统获得公安部一所首批安全性能认证
  5. 使用JDBCTemplate实现与Spring结合,方法公用 ——共用实现类(BaseImpl)
  6. C/C++中const关键字的用法及其与宏常量的比较
  7. 织梦根目录感染abc.php,织梦SEO优化:织梦dedecms根目录下robots.txt文件设置详解! - 张俊SEO...
  8. 在Python中使用try-except-else是否是一种好习惯?
  9. 推荐系统(Recommendation System )介绍
  10. 在win7中chm打不开的方法
  11. EasyAR4.0简单使用说明
  12. ElasticSearch的REST APIs 之 索引的状态管理
  13. BUUCTF-神秘龙卷风
  14. html网页制作,前端三剑客一
  15. 网络安全学习小结--kali基本工具、webshell、代码审计
  16. 远程开机:一个简单的嵌入式项目开发
  17. 测试之美(2)对测试的几点理解----谁是利益相关者?
  18. android自定义标尺,Android自定义标尺滑动选择值效果
  19. 2022年福建最新中级消防员模拟试题题库及答案
  20. 「Vue自我检验」Vue 组件进阶知识,你了解多少?

热门文章

  1. AVOD、SVOD、TVOD、PVOD:揭秘视频点播商业模式
  2. avod论文理解与代码解读
  3. 手机java版怎么换皮肤_手机QQ皮肤更换方法(安卓版)
  4. 面对性骚扰,Siri Alexa等AI助手如何应对
  5. java企业绩效_员工绩效管理系统,基于SSM框架下的JAVA系统
  6. 用vbs脚本实现软件的自动登录
  7. Android ListView优化总结
  8. Unable to find setter method for attribute: [commandName]
  9. fastboot驱动安装问题——文件哈希值不在指定目录
  10. Android自学视频百度网盘链接