C++头文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++头文件相关的知识,希望对你有一定的参考价值。
#include "iostream"
#include "string"
#include "fstream"
using namespace std;
#define NULL 0
unsigned int key;
unsigned int key2;
和
#include "string.h"
#include "fstream.h"
#define NULL 0
unsigned int key;
unsigned int key2;
区别在哪
① <cstddef> 定义宏NULL和offsetof,以及其他标准类型size_t和ptrdiff_t。与对应 的标准C头文件的区别是,NULL是C++空指针常量的补充定义,宏offsetof接受 结构或者联合类型参数,只要他们没有成员指针类型的非静态成员即可。
② <limits> 提供与基本数据类型相关的定义。例如,对于每个数值数据类型,它定义 了可以表示出来的最大值和最小值以及二进制数字的位数。
③ <climits> 提供与基本整数数据类型相关的C样式定义。这些信息的C++样式定义 在 <limits>中
④ <cfloat> 提供与基本浮点型数据类型相关的C样式定义。这些信息的C++样式定义 在 <limits>中
⑤ <cstdlib> 提供支持程序启动和终止的宏和函数。这个头文件还声明了许多其他杂 项函数,例如搜索和排序函数,从字符串转换为数值等函数。它与对应的标准C 头文件stdlib.h不同,定义了abort(void)。abort()函数还有额外的功能,它不为静态 或自动对象调用析构函数,也不调用传给atexit()函数的函数。它还定义了exit()函 数的额外功能,可以释放静态对象,以注册的逆序调用用atexit()注册的函数。清 除并关闭所有打开的C流,把控制权返回给主机环境。
⑥ <new> 支持动态内存分配
⑦ <typeinfo> 支持变量在运行期间的类型标识
⑧ <exception> 支持异常处理,这是处理程序中可能发生的错误的一种方式
⑨ <cstdarg> 支持接受数量可变的参数的函数。即在调用函数时,可以给函数传送数 量不等的数据项。它定义了宏va_arg、va_end、va_start以及va_list类型
⑩ <csetjmp> 为C样式的非本地跳跃提供函数。这些函数在C++中不常用
11 <csignal> 为中断处理提供C样式支持
2. C2类输入/输出头文件
① < iostream> 支持标准流cin、cout、cerr和clog的输入和输出,它还支持多字节字 符标准流wcin、wcout、wcerr和wclog。
② <iomanip> 提供操纵程序,允许改变流的状态,从而改变输出的格式。
③ <ios> 定义iostream的基类
④ <istream> 为管理输出流缓存区的输入定义模板类
⑤ <ostream> 为管理输出流缓存区的输出定义模板类
⑥ <sstream> 支持字符串的流输入输出
⑦ <fstream> 支持文件的流输入输出
⑧ <iosfwd> 为输入输出对象提供向前的声明
⑨ <streambuf> 支持流输入和输出的缓存
⑩ <cstdio> 为标准流提供C样式的输入和输出
11 <cwchar> 支持多字节字符的C样式输入输出
3. C3类诊断头文件
① <stdexcept> 定义标准异常。异常是处理错误的方式
② <cassert> 定义断言宏,用于检查运行期间的情形
③ <cerrno> 支持C样式的错误信息
4. C4类一般工具头文件
① <utility> 定义重载的关系运算符,简化关系运算符的写入,它还定义了pair类型, 该类型是一种模板类型,可以存储一对值。这些功能在库的其他地方使用
② <functional> 定义了许多函数对象类型和支持函数对象的功能,函数对象是支持 operator()()函数调用运算符的任意对象
③ <memory> 给容器、管理内存的函数和auto_ptr模板类定义标准内存分配器
④ <ctime> 支持系统时钟函数
5. C5类字符串头文件
① <string> 为字符串类型提供支持和定义,包括单字节字符串(由char组成)的string 和多字节字符串(由wchar_t组成)
② <cctype> 单字节字符类别
③ <cwctype> 多字节字符类别
④ <cstring> 为处理非空字节序列和内存块提供函数。这不同于对应的标准C库头文 件,几个C样式字符串的一般C库函数被返回值为const和非const的函数对替代 了
⑤ <cwchar> 为处理、执行I/O和转换多字节字符序列提供函数,这不同于对应的标 准C库头文件,几个多字节C样式字符串操作的一般C库函数被返回值为const 和非const的函数对替代了。
⑥ <cstdlib> 为把单字节字符串转换为数值、在多字节字符和多字节字符串之间转换 提供函数
6. C6类容器头文件
① <vector> 定义vector序列模板,这是一个大小可以重新设置的数组类型,比普通数 组更安全、更灵活<list> 定义list序列模板,这是一个序列的链表,常常在任意位 置插入和删除元素
② <deque> 定义deque序列模板,支持在开始和结尾的高效插入和删除操作
③ <queue> 为队列(先进先出)数据结构定义序列适配器queue和priority_queue
④ <stack> 为堆栈(后进先出)数据结构定义序列适配器stack
⑤ <map> map是一个关联容器类型,允许根据键值是唯一的,且按照升序存储。 multimap类似于map,但键不是唯一的。
⑥ <set> set是一个关联容器类型,用于以升序方式存储唯一值。multiset类似于set, 但是值不必是唯一的。
⑦ <bitset> 为固定长度的位序列定义bitset模板,它可以看作固定长度的紧凑型bool 数组
7. C7类迭代器支持头文件
① <iterator> 给迭代器提供定义和支持
8. C8类算法头文件
① <algorithm> 提供一组基于算法的函数,包括置换、排序、合并和搜索
② <cstdlib> 声明C标准库函数bsearch()和qsort(),进行搜索和排序
③ <ciso646> 允许在代码中使用and代替&&
9. C9类数值操作头文件
① <complex> 支持复杂数值的定义和操作
② <valarray> 支持数值矢量的操作
③ <numeric> 在数值序列上定义一组一般数学操作,例如accumulate和inner_product
④ <cmath> 这是C数学库,其中还附加了重载函数,以支持C++约定
⑤ <cstdlib> 提供的函数可以提取整数的绝对值,对整数进行取余数操作
10. C10头本地化文件
① <locale> 提供的本地化包括字符类别、排序序列以及货币和日期表示。
② <clocale> 对本地化提供C样式支持
http://blog.sina.com.cn/s/blog_a267587b010187zd.html参考于这个 参考技术A <iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因 此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 一 :
<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
因 此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
所谓namespace,是指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。
using std::cout;
using std::endl;
以上程序可以写成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std;
例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout << hex << 3.4 << endl;
因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准 库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。
所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。
命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"
转自:http://hi.baidu.com/oaini_1314/blog/item/31a50494eeeb5418d21b70ae.html 参考技术B 简单的说第一种写法在c里是不识别的,它只能在.c++文件里执行,而后者不管在C里还是C++里都是正确的,因为他是C语言的写法,但C++兼容,故而不会错喽! 参考技术C 一个是 C语言 一个是 c++ 就这么点 主要就在using namespace std上面 写它在c++中可以不用写.h C++头文件要是出现.h的话容易出错~~~ 参考技术D iostream
这个是输入输出流
等于导入了一个包,帮你写好了输入输出的函数
就是cin<< cout<<
如果不定义的话,无法使用这个函数的
string
顾名思意,就是字符串啦
如果不申明的话就要自己写个函数,来储存字符串啦
还有string是自带的库函数
而string.h是写好的函数文件,有可能是自己重写的函数
这也是个差别
Visual Studio 不区分 C 头文件和 C++ 头文件
【中文标题】Visual Studio 不区分 C 头文件和 C++ 头文件【英文标题】:Visual Studio does not differentiate between C headers and C++ headers 【发布时间】:2017-08-29 14:49:10 【问题描述】:我正在使用 Visual Studio 2017-enterprise 使用 C 语言,但是 C 头文件存在一个复杂的问题,因为 Visual Studio 会考虑每个头文件
是一个 C++ 头文件。所以,无论扩展名是.hpp
还是.h
,都会把它当作C++头,
这会导致问题,因为我使用的是 C99,Visual Studio 会认为头文件是 C++,所以我不能在头文件中使用 C 功能。
注意:当我将源文件命名为 .c
时,Visual Studio 将其视为 C 文件,而不是 C++,这很好。所以我需要对标题做同样的事情。
我需要为 c 制作 .h 和为 c++ 制作 .hpp 如何?
VS 2010、2013、2015 也存在此问题。
编辑::
突出显示的问题,例如,如果我在 .c 中创建类 file visula studio 会说有错误,但这不会显示任何 如果我在 .h 文件中创建类,即使我使用 extern"C"
也会出错
看看这张图片: source.h 现在看看这个 source.c
【问题讨论】:
一切都取决于你调用头文件的位置。考虑将extern "C"
用于C 代码。在您提到的任何版本中,这都不是问题。它对 C 和 C++ 分别按预期工作。如果你包含 .cpp 中的 .h 文件,那么你就错过了。
头文件不是编译单元。
标头未编译为 C 或 C++。源文件被编译。如果某些头文件必须包含在 c 和 c++ 源代码文件中 - 使用 #ifdef __cplusplus
您缺少哪些 C 功能?语法高亮?代码完成?
您能否创建一个 MCVE (minimal reproducible example) 来说明您面临的问题?您需要一个包含 C 编译器支持但 C++ 编译器拒绝的 C99 功能的标头示例,并且您需要显示使用该标头的 C 程序,以及来自确切命令行的确切错误消息当您使用该标头编译该 C 代码时执行。
【参考方案1】:
如果你 #include
来自 .c
文件的 .h
文件,则 Visual Studio 会将其编译为 C。如果你 #include
来自 .cpp
文件的 .h
文件,则 Visual Studio 将编译它作为 C++。
在特定于 C 的标头中这样做很常见:
#ifdef __cplusplus
extern "C"
#endif
void MyCFunction();
void MyCFunction2();
#ifdef __cplusplus
#endif
这允许您声明用 C 实现的函数。其他 C 源代码可以使用这些函数,而 C++ 源代码可以使用这些函数。
您真的不需要担心 C++ 特定的标头,因为如果您在 C 源代码中 #include
它们只会出现编译错误。
【讨论】:
高亮问题【参考方案2】:据我了解,您遇到的问题是您正在尝试在 vscode 中开发 C 代码,但是编辑器一直试图将 *.h
文件视为 C++
文件而不是 C
文件,基本上是这样是因为据我所知 MS 讨厌 C
。我遇到了同样的问题,所以这是我最终使用的解决方案:
-
按
Ctrl
+Shift
+P
打开命令面板
开始输入Preferences: Configure language specific settings
选择C
,这将打开Settings.json
如果未定义键 "files.associations"
,则必须定义它,并在其中添加 "*.h": "c",
属性。
最后文件应该是这样的:
//...other settings
"files.associations":
"*.h": "c",
,
//...other settings
每当您打开以.h
结尾的文件时,这会将编辑器模式设置为C
。您可以为all these languages 定义类似的设置。
【讨论】:
【参考方案3】:“这会导致问题,因为我使用的是 C99,Visual Studio 会认为头文件是 C++,所以我不能在头文件中使用 C 功能。”
不,问题是 Visual Studio 在任何地方都不支持 C99,无论是在头文件中还是在 .C 文件中。 Visual Studio 遵循 ISO C90。
【讨论】:
好的:但我仍然需要 Visual Studio 作为语法荧光笔:所以我需要它来考虑 .h 是 c 文件,而 .hpp 作为 cpp 文件是否有任何解决方案或者我需要创建 vs-插件来做到这一点? @Rihcodo:无论来源如何,VS 荧光笔都使用 C++ 规则。试试 `int class`,在 C89 中完全有效。以上是关于C++头文件的主要内容,如果未能解决你的问题,请参考以下文章