C++中的iostream和iostream.h

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.cpp
 In 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; //方法1
  return 0;
}

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

//example2.cpp
#include <iostream>
using std::cout;              //方法2
using std::endl;              //方法2

int main(void)
{
  cout<<"Hello World"<<endl;
  return 0;
}

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

//example3.cpp
#include <iostream>
using namespace std;            //方法3

int 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++ 命名空间
  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值