I O 是我们最基本的需求之一。比如当我们进入C + + 世界时所接触的第一个程序
H e l l o W o r l d ,采用p r i n t f ( ) 或o p e r a t o r < < 都可以。所以,我们会有如下的版本:
//Version 1
#include < stdio.h >
int main()
{
printf("Hello World");
return 0;
}
//Version 2
#include < cstdio >
int main()
{
std::printf("Hello World");
return 0;
}
//Version 3
#include < iostream.h >
int main()
{
cout<<"Hello World";
return 0;
}
//Version 4
#include < iostream >
using namespace std;
int main()
{
cout<<"Hello World";
return 0;
}
s t d i o . h 、c s t d i o 两个头文件中都有p r i n t f ( ) 的定义,而i o s t r e a m . h 和i o s t r e a m 中也都有
o p e r a t o r < < 的定义。是s t d i o . h 还是c s t d i o ?是i o s t r e a m . h 还是i o s t r e a m ?是p r i n t f ( ) 还是
o p e r a t o r < < ?这些都值得思考。
关于F i l e . h 和F i l e ,这还得从C + + 标准库说起。C + + 标准程序库涵盖范围相当大,包含
了许多好用的功能,所以,标准库与第三方提供程序库中的类型名称和函数名称发生名称冲
突的可能性大大增加。为了避免这个问题的发生,标准委员会决定让标准库中的内容都披上
s t d 的外衣,放在s t d 名空间中。但是这么做同时又带来了一个新的兼容性问题:很多C + +
程序代码依赖的都是没有用s t d 包装的C + + “准”标准库,例如i o s t r e a m . h 等,如果将原有
的i o s t r e a m . h 贸然代替掉,那肯定会引起众多程序员的抗议。
标准化委员会最后决定设计一种新的头文件名来解决这个问题。于是,他们把C + + 头
文件F i l e . h 中的. h 去掉,将F i l e 这样没有后缀的头文件名分配给那些用s t d 包装过的组件使
用;而旧有的F i l e . h 保持不变,仅仅在标准中声明不再支持它,顺势把问题丢给了广大厂商,
堵住了那些老程序员抗议的嘴。同样,对C 的头文件也做了相同的处理,在前面加上了一个
字母c 以示区分。因为C + + 标准还要遵守“对C 兼容”这个契约,备受“歧视”的旧有的C
头文件“侥幸存活”了下来。虽然标准化委员会选择抛弃那些旧有的C + + 头文件,但是各大
厂商为了各自的商业利益,却依然选择了对旧有C + + 头文件的支持。
因此就出现了类似s t d i o . h 和c s t d i o 、i o s t r e a m . h 和i o s t r e a m 这样的双胞胎:
// 标准化以前C++ 中的C 标准库,标准C 的头文件继续获得支持,这类文件的内容并
// 未放在std 中
#include<stdio.h>
// 标准化后经过改造的C 的标准库,C 的标准库对应的新式C++ 版本,这类头文件的
// 内容也有幸穿上了std 的外衣
#include<cstdio>
// 标准化以前的头文件,这些头文件的内容将不处于namespace std 中
#include<iostream.h>
// 标准化以后的标准头文件,它提供了和旧有的头文件相同的功能,但它的内容都并
第2 章 从C 到C + + ,需要做出一些改变 5 7
// 入了namespace std 中,从而有效避免了名称污染的问题
#include<iostream>
其实标准化以后标准程序库的改动并不只有这些,很多标准化的组件都被模板化了。具
体参见侯捷翻译的《C + + 标准程序库》。
H e l l o W o r l d ,采用p r i n t f ( ) 或o p e r a t o r < < 都可以。所以,我们会有如下的版本:
//Version 1
#include < stdio.h >
int main()
{
printf("Hello World");
return 0;
}
//Version 2
#include < cstdio >
int main()
{
std::printf("Hello World");
return 0;
}
//Version 3
#include < iostream.h >
int main()
{
cout<<"Hello World";
return 0;
}
//Version 4
#include < iostream >
using namespace std;
int main()
{
cout<<"Hello World";
return 0;
}
s t d i o . h 、c s t d i o 两个头文件中都有p r i n t f ( ) 的定义,而i o s t r e a m . h 和i o s t r e a m 中也都有
o p e r a t o r < < 的定义。是s t d i o . h 还是c s t d i o ?是i o s t r e a m . h 还是i o s t r e a m ?是p r i n t f ( ) 还是
o p e r a t o r < < ?这些都值得思考。
关于F i l e . h 和F i l e ,这还得从C + + 标准库说起。C + + 标准程序库涵盖范围相当大,包含
了许多好用的功能,所以,标准库与第三方提供程序库中的类型名称和函数名称发生名称冲
突的可能性大大增加。为了避免这个问题的发生,标准委员会决定让标准库中的内容都披上
s t d 的外衣,放在s t d 名空间中。但是这么做同时又带来了一个新的兼容性问题:很多C + +
程序代码依赖的都是没有用s t d 包装的C + + “准”标准库,例如i o s t r e a m . h 等,如果将原有
的i o s t r e a m . h 贸然代替掉,那肯定会引起众多程序员的抗议。
标准化委员会最后决定设计一种新的头文件名来解决这个问题。于是,他们把C + + 头
文件F i l e . h 中的. h 去掉,将F i l e 这样没有后缀的头文件名分配给那些用s t d 包装过的组件使
用;而旧有的F i l e . h 保持不变,仅仅在标准中声明不再支持它,顺势把问题丢给了广大厂商,
堵住了那些老程序员抗议的嘴。同样,对C 的头文件也做了相同的处理,在前面加上了一个
字母c 以示区分。因为C + + 标准还要遵守“对C 兼容”这个契约,备受“歧视”的旧有的C
头文件“侥幸存活”了下来。虽然标准化委员会选择抛弃那些旧有的C + + 头文件,但是各大
厂商为了各自的商业利益,却依然选择了对旧有C + + 头文件的支持。
因此就出现了类似s t d i o . h 和c s t d i o 、i o s t r e a m . h 和i o s t r e a m 这样的双胞胎:
// 标准化以前C++ 中的C 标准库,标准C 的头文件继续获得支持,这类文件的内容并
// 未放在std 中
#include<stdio.h>
// 标准化后经过改造的C 的标准库,C 的标准库对应的新式C++ 版本,这类头文件的
// 内容也有幸穿上了std 的外衣
#include<cstdio>
// 标准化以前的头文件,这些头文件的内容将不处于namespace std 中
#include<iostream.h>
// 标准化以后的标准头文件,它提供了和旧有的头文件相同的功能,但它的内容都并
第2 章 从C 到C + + ,需要做出一些改变 5 7
// 入了namespace std 中,从而有效避免了名称污染的问题
#include<iostream>
其实标准化以后标准程序库的改动并不只有这些,很多标准化的组件都被模板化了。具
体参见侯捷翻译的《C + + 标准程序库》。