原创 转载请注明出处
注明:以下所指的.h都是指代#include<>的尖括号中是否带.h的问题 当用引号时,带什么取决于你的文件后缀名
【简而言之】
C语言:C语言中的头文件都会带.h
C++98以前版本:仍然沿用着带.h的C版本 以寻求兼容性
C++98以及以后:规定用户最好使用新版本的头文件(不带.h的) 但是还是保留了.h以求和以前版本还有C代码兼容
【深入探讨】
这个问题里 C++之父B.S给出了他自己对于这个问题的看法:
"The committee decided that the .h was unnecessary to establish a connection between a compiler and its standard libraries, that removing it was a good way of eliminating compatibility problems with pre-standard versions of headers, e.g. "iostream.h" vs. <iostream>. Also, there were implementations that did not use ordinary character files to hold their standard headers (I don't know if there are any now).
The decision had nothing to do with templates.
I don't miss the .h. "
个人意见:我自己还是按照BS老人家的说法 去掉了.h
当然 如果去掉.h 会有一个问题 那就是当调用标准库中的函数前 需要在每一个前面加上std::
或者在文件前直接加上using namespace std;来表示全部标准库的函数前都已经自动加好。
原因如下:
C语言中 所有的函数都是全局函数
而到了C++中 函数都被定义在了名字空间std中 所以每当你使用的时候 需要加上他的名字 这类似于成员函数前也都有类的名字
也就是说 虽然不带.h的 你需要在前面写一句using namespace std; 但是这却更加符合C++面向对象的程序设计
【 值得注意 】
引号中内容引自:
http://club.topsage.com/thread-2271422-1-1.html
"另外,为了和C语言兼容,C++标准化过程中,原有C语言头文件标准化后,头文件名前带个c字母,如cstdio、cstring、ctime、ctype等等。这些头文件都可以在 C:\Program Files\Microsoft Visual Studio 10.0\VC\include 这个目录下找到(以VC2010为例)。也就是说,我们如果要用C++标准化了的C语言头文件,就得作如下的转换
include <stdio.h> --> #include <cstdio>
include <stdlib.h> --> #include <cstdlib>
include <string.h> --> #include <cstring>
还要提及的一点是,我在看C++标准库的时候,看到一个特殊情况 <memory.h> 和 <memory>,这两个头文件是完全不同的,因为我发现 <memory.h>头文件件包含了 <mem.h>;而 <memory> 包含 <memory.stl>"