在C++11标准中,对如何兼容使用C语言的标准库头文件进行了说明:
就是你在C++程序里使用C语言的头文件,在使用C++编译器进行编译时,是OK的。
这时因为C++里面也存放了上面列的26个C语言标准库头文件,可以直接使用,同时这些头文件定义的东西都是在全局作用域里的。
另外一种C++下使用C头文件的的方式,是#include <cname>形式,比如#include <cstdio>。
这种方式和上面的作用是一样的,都在全局作用域下可以使用C标准库头文件里定义的东西。
但同时,这种方式将这些头文件的定义也放在std作用域里。
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
$ g++ -o test test.cpp
$ ./test
Hello world!
#include <cstdio>
int main()
{
printf("Hello world!\n");
std::printf("Hello world!\n");
return 0;
}
$ g++ -o test test.cpp
$ ./test
Hello world!
Hello world!
总结:
只在C++标准中有的头文件,不使用filename.h。因为从第一个C++标准开始(1998年),就是用的是filename作为头文件。
比如,在ubuntu中发现的头文件:
$ ls /usr/include/c++/9/iostream -l
-rw-r--r-- 1 root root 2695 8月 8 2020 /usr/include/c++/9/iostream
那些从C标准继承过来的头文件,从filename.h变成了cfilename,并且filename.h头文件已经被不建议使用,但仍然是C++标准的一部分。
stddef.h和cstddef,前面的符号(不包括宏)是在全局命名空间,后面的是在std命名空间里。
所以引用的话有不同:
::size_t in stddef.h
std::size_t in cstddef
这两种都是C++标准所支持的,但第一种已经被淘汰。
为什么要使用`filename.h`?
- 与C语言编译器的兼容性
- 与非常老的C++编译器兼容
为什么要使用`cfilename`?
- 名称都在std::的命名空间内。没有名字冲突了。
- 新的C++特性(例如float, long的重载数学函数)
- C兼容头文件(filename.h)将来可能会消失。