头文件的作用 早期的编程语言如Basic、Fortran 没有头文件的概念,C++/C 语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件的作用略作解释: (1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。 (2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。 大家写程序是建立在编译器系统为我们提供的底层标准库函数基础上,这些库函数的接口就声明在标准库头文件中。若想编写高效的程序,我们要对编译器系统提供的标准库函数信手拈来,首先要熟知他们的声明所在的头文件。
以下是对C/C++常用头文件进行简单梳理:
标准C控制台输入输出流函数头文件<cstdio>-----<stdio.h>
using ::size_t; using ::fpos_t; using ::FILE;
using ::clearerr; using ::fclose; using ::feof;
using ::ferror; using ::fflush; using ::fgetc;
using ::fgetpos; using ::fgets; using ::fopen;
using ::fprintf; using ::fputc; using ::fputs;
using ::fread; using ::freopen; using ::fscanf;
using ::fseek; using ::fsetpos; using ::ftell;
using ::fwrite; using ::getc; using ::getchar;
using ::gets; using ::perror;
using ::putc; using ::putchar;
using ::printf; using ::puts; using ::remove;
using ::rename; using ::rewind; using ::scanf;
using ::setbuf; using ::setvbuf; using ::sprintf;
using ::sscanf; using ::tmpfile; using ::tmpnam;
using ::ungetc; using ::vfprintf; using ::vprintf;
using ::vsprintf;
wsprintf() //winuser.h,include in windows.h
size_t一般用来表示一种计数,比如有多少东西被拷贝等,sizeof操作符的结果类型是size_t,它在头文件中typedef为 unsigned int类型,即typedef unsigned int size_t ,该类型保证能容纳实现所建立的最大对象的字节大小。strncat,strncmp,strncpy等都用到了它。
size_t 是为了方便系统之间的移植而定义的,在32位系统上 定义为unsigned int,在64位系统上 定义为unsigned long。
标准库函数头文件<cstdlib>-----<stdlib.h>
using ::size_t; using ::div_t; //div_t div( int numer, int denom );
using ::ldiv_t; //ldiv_t div( long numer, long denom);
//非正常结束程序;终止程序;注册终止函数
using ::abort; using ::exit; using ::atexit;
//整形、长整型绝对值
using ::abs; using ::labs;
// 整形、长整型除法
using ::div; using ::ldiv;
//字符串转换
using ::atof; using ::atoi; using ::atol; using ::strtoul; using ::strtod; using ::strtol;
//转换为字符串<stdlib.h>_ecvt _fcvt _gcvt _itoa _ltoa _ultoa
using ::mblen; using ::mbstowcs; using ::mbtowc;
using ::bsearch;//在数组中执行二分查找
using ::qsort;//执行快速排序
//分配内存;分配内存;重新分配内存;释放内存
using ::calloc; using ::malloc; using ::realloc; using ::free;
using ::getenv;//获取环境变量
using ::rand; using ::srand;//随机种子
using ::system; //调用DOS下的COMMAND.COM
using ::wcstombs; using ::wctomb;
标准字符串函数头文件<cstring>-----<string.h>
字符串的处理可以用STL字符串类<string>
using ::size_t;
using ::memchr; //从缓冲区中查找第一个char
using ::memcmp; //比较buf1和buf2的N个字符
using ::memcpy; //从源复制N个字符到目的地
using ::memmove;
using ::memset; //将char复制到缓冲区的N个字符位置
using ::strcat; //将一个字符串添加到另一个字符串的后面
using ::strchr; //定义char在字符串中首次出现的位置
using ::strcmp;//比较两个字符串
using ::strcoll;
using ::strcpy; //将一个字符串的字符复制到另一个字符串
using ::strcspn; //定位给定字符集中的字符在字符串中首次出现的位置
using ::strerror;
using ::strlen; //字符串长度
using ::strncat; //在字符串后添加字符
using ::strncmp; //比较两个字符串中的字符
using ::strncpy; //将一个字符串的字符复制到另一个字符串
using ::strpbrk;
using ::strrchr; //定位给定字符在字符串中最后出现的位置
using ::strspn; //定位给定字符集在字符串中首次出现的位置
using ::strstr;//定为一个字符串在另一个字符串中的位置
using ::strtok; using ::strxfrm;
注意:下面的函数针对ASCII码的处理,即char[]的处理。如果要处理Unicode字符串即wchar_t[],则不能使用,例如strcpy<->wcscpy
标准数学函数头文件<cmath>-----<math.h>
using ::acosf; using ::asinf;
using ::atanf; using ::atan2f; using ::ceilf;
using ::cosf; using ::coshf; using ::expf;
using ::fabsf; using ::floorf; using ::fmodf;
using ::frexpf; using ::ldexpf; using ::logf;
using ::log10f; using ::modff; using ::powf;
using ::sinf; using ::sinhf; using ::sqrtf;
using ::tanf; using ::tanhf;
using ::acosl; using ::asinl;
using ::atanl; using ::atan2l; using ::ceill;
using ::cosl; using ::coshl; using ::expl;
using ::fabsl; using ::floorl; using ::fmodl;
using ::frexpl; using ::ldexpl; using ::logl;
using ::log10l; using ::modfl; using ::powl;
using ::sinl; using ::sinhl; using ::sqrtl;
using ::tanl; using ::tanhl;
using ::abs;
using ::acos; using ::asin;
using ::atan; using ::atan2; using ::ceil;
using ::cos; using ::cosh; using ::exp;
using ::fabs; using ::floor; using ::fmod;
using ::frexp; using ::ldexp; using ::log;
using ::log10; using ::modf; using ::pow;
using ::sin; using ::sinh; using ::sqrt;
using ::tan; using ::tanh;
标准日期和时间函数头文件<ctime>-----<time.h>
using ::size_t;
using ::clock_t;
using ::time_t;
using ::tm;
using ::asctime; //使用tm结构将日期和时间转换成ASCII字符串
using ::clock;
using ::ctime; //将日期和时间转换成字符串
using ::difftime; //计算2个时间之差
using ::gmtime; //使用tm结构将日期和时间转换成GMT
using ::localtime; //将日期和时间转换成tm结构
using ::mktime;
using ::strftime; //格式化日期和时间以便输出
using ::time; //从系统获取当前时间
说明:
(1)头文件名的大小写问题
在VS6.0的\VC98\INCLUDE下的标准库头文件都是大写:STDIO.H和CSTDIO。
而在VS8.0的\VC\include下的标准库头文件都是小写:stdio.h和cstdio。
由于Windows环境中忽略文件名的大小写检查,所以VC中包含头文件时,大小写不限。
例如#include <StdIO.h>和#include <stdio.h>都将在VC下编译通过。
除标准C/C++头文件之外,不同的编译器可能提供第三方支持库,但是对于标准C/C++头文件应尽量区分注意大小写以提高代码的可移植性,比如当需要将C/C++代码从Windows移植到对文件名大小写很敏感的Linux下时。
(2)标准c++中的使用传统C头文件中的函数
使用标准c++中的C头文件时,要注意所有的C函数都是放在namespace std中,所以在includec++标准头文件后,应导入对命名空间:using namespace std。例如:
#include <cstdio>
using namespace std;
再调用传统C的printf函数。
(3)在windows编程中等标准C库<stdio.h> <stdlib.h> <string.h><time.h>都已包含到<windows.h>头文件中。
(4)在很多MFC的类库头文件中已经包含<windows.h>头文件,注意不要重复包含。
(5)引用头文件的两种方式:
用#include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
用#include “filename.h” 格式来引用非标准库的头文件(编译器将从工作目录开始搜索)。
(6)因为编译器也是顺序编译的,所以有时候要注意头文件包含的顺序问题。
典型的如<afx.h><windows.h> ,如果换个顺序就会出错。
参考:
《高质量C++编程指南》
《头文件包含顺序以及连接问题》
http://topic.csdn.net/u/20080720/22/1f96d841-8845-4cfc-8b9e-007a3bf4f8c2.html
《如何在非MFC程序中使用MFC类》
http://blog.csdn.net/surepretty/archive/2009/03/20/4006545.aspx
评论