c语言编译01--预处理--头文件的结构和用途
2011-10-31 17:10
260 查看
文件的结构
C++/C源程序通常分为两类文件。一类文件用于保存程序的声明,称为头文件;另一类文件用于保存程序的实现,称为源文件(或者定义文件)。
C++/C程序的头文件以“.h”为后缀,C程序的源文件以“.c”为后缀,C++程序的源文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。
C++/C编译器在扫描到一条函数调用语句时首先应当知道该函数的原型或定义,函数原型一般都放在头文件中,函数定义则放在源文件中,当源文件或头文件通过#include指令包含另一个头文件的时候,编译预处理器用头文件的内容取代#include伪指令。这就是说,头文件的所有内容最终都会被合并到某一个或某几个源文件中,如此将每一个包含的头文件递归地展开后形成的源文件就叫编译单元。
头文件的用途和结构
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需按照头文件中的接口声明来调用库函数,而不必关心接口是怎么实现的。连接器会从库中提取相应的代码,并和用户的程序连接生成可执行文件或者动态连接库文件;
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时的方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担;
(3)头文件可以提高程序的可读性(清晰性)。
头文件中的元素比较多,其顺序(结构)一般应安排如下:
(1)头文件注释(包括文件说明、功能描述、版权声明等)(必须有);
(2)内部包含卫哨开始(#ifndef XXX/#define XXX)(必须有);
(3)#include其他头文件(如果需要);
(4)外部变量和全局函数声明(如果需要);
(5)常量和宏定义(如果需要);
(6)类型前置声明和定义(如果需要);
(7)全局函数原型和内联函数的定义(如果需要);
(8)内部包含卫哨结束:#endif // XXX(必须有);
(9)文件版本及修订说明。
上述排列顺序并非绝对,也不存在对错之分,可根据具体情况灵活安排。
如果程序中需要内联函数,那么内联函数的定义应当放在头文件中,因为内联函数调用语句最终被扩展开来而不是采用真正的函数调用机制。
例子:AgentDevCnc.h
#ifndef AGENTDEV_H_
#define AGENTDEV_H_
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>
#include <sqlca.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>
#include <memory.h>
#include <signal.h>
#include <math.h>
#define _LOG_FILE "agent_dev_cnc"
typedef struct _ChargeItem {
char chargeCode[FEEITEMNUM][CHARGE_CODE_LEN + 1];
float charge[FEEITEMNUM];
char userNo[FEEITEMNUM][USER_NO_LEN + 1];
int idx;
};
typedef struct _ChargeItem ChargeItem;
int StringIsDigit(const char *cString);
#endif
------------
源文件中使用:#include "AgentDevCnc.h"
C++/C源程序通常分为两类文件。一类文件用于保存程序的声明,称为头文件;另一类文件用于保存程序的实现,称为源文件(或者定义文件)。
C++/C程序的头文件以“.h”为后缀,C程序的源文件以“.c”为后缀,C++程序的源文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。
C++/C编译器在扫描到一条函数调用语句时首先应当知道该函数的原型或定义,函数原型一般都放在头文件中,函数定义则放在源文件中,当源文件或头文件通过#include指令包含另一个头文件的时候,编译预处理器用头文件的内容取代#include伪指令。这就是说,头文件的所有内容最终都会被合并到某一个或某几个源文件中,如此将每一个包含的头文件递归地展开后形成的源文件就叫编译单元。
头文件的用途和结构
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需按照头文件中的接口声明来调用库函数,而不必关心接口是怎么实现的。连接器会从库中提取相应的代码,并和用户的程序连接生成可执行文件或者动态连接库文件;
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时的方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担;
(3)头文件可以提高程序的可读性(清晰性)。
头文件中的元素比较多,其顺序(结构)一般应安排如下:
(1)头文件注释(包括文件说明、功能描述、版权声明等)(必须有);
(2)内部包含卫哨开始(#ifndef XXX/#define XXX)(必须有);
(3)#include其他头文件(如果需要);
(4)外部变量和全局函数声明(如果需要);
(5)常量和宏定义(如果需要);
(6)类型前置声明和定义(如果需要);
(7)全局函数原型和内联函数的定义(如果需要);
(8)内部包含卫哨结束:#endif // XXX(必须有);
(9)文件版本及修订说明。
上述排列顺序并非绝对,也不存在对错之分,可根据具体情况灵活安排。
如果程序中需要内联函数,那么内联函数的定义应当放在头文件中,因为内联函数调用语句最终被扩展开来而不是采用真正的函数调用机制。
例子:AgentDevCnc.h
#ifndef AGENTDEV_H_
#define AGENTDEV_H_
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>
#include <sqlca.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>
#include <memory.h>
#include <signal.h>
#include <math.h>
#define _LOG_FILE "agent_dev_cnc"
typedef struct _ChargeItem {
char chargeCode[FEEITEMNUM][CHARGE_CODE_LEN + 1];
float charge[FEEITEMNUM];
char userNo[FEEITEMNUM][USER_NO_LEN + 1];
int idx;
};
typedef struct _ChargeItem ChargeItem;
int StringIsDigit(const char *cString);
#endif
------------
源文件中使用:#include "AgentDevCnc.h"
相关文章推荐
- gcc编译过程、C语言编译过程分析、环境变量设置、linux文件夹结构和用途介绍、常用文件和目录的操作命令、文件类型
- c语言的预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含
- C语言预处理指令:宏、条件编译、文件包含
- C++头文件与多文件结构,编译预处理
- 多文件结构和编译预处理命令
- IOS开发---C语言-㉑预处理指令:宏定义、条件编译、文件包含
- C语言include预处理命令与多文件编译
- C++程序设计必知:多文件结构和编译预处理命令
- 鸡啄米:C++编程入门系列之二十四(C++程序设计必知:多文件结构和编译预处理命令)
- C++多文件结构和编译预处理命令
- c语言三种预处理--宏定义,文件包含,条件编译
- 二十四、C++程序设计必知:多文件结构和编译预处理命令
- 多文件结构和编译预处理命令
- C++程序设计必知:多文件结构和编译预处理命令
- class文件结构[1] 编译前预处理
- C++编程入门系列之二十四(C++程序设计必知:多文件结构和编译预处理命令)
- C++多文件结构和编译预处理命令
- C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- C语言编译产生的.OBJ文件和汇编编译产生的.OBJ文件,如何连接_百度知道
- eclipse文件目录结构之编译存放,以及tomcat存放路径