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