c语言础模块化编程及头文件源文件设计.docVIP

  • 6
  • 0
  • 约1.14万字
  • 约 5页
  • 2017-06-13 发布于河南
  • 举报

c语言础模块化编程及头文件源文件设计.doc

c语言础模块化编程及头文件源文件设计

模块化编程与头文件学习笔记 在大规模程序开发中,一个程序由很多个模块组成,这些模块的编写任务被分配到不同的程序员。而你在编写这个模块的时候很可能就需要利用到别人写好的模块的借口,这个时候我们关心的是,它的模块实现了什么样的接口,我该如何去调用,至于模块内部是如何组织的,对于我而言,无需过多关注。理想的模块可以看成是一个黑盒子,我们只关心模块提供的功能,而不管模块内部的实现细节。通过接口调用实现大规模程序的级联与组合。 头文件的理解: 头文件可以称其为一份接口描述文件。描述的内容就是我们的模块对外提供的接口函数或者是接口变量,同时该文件也包含了一些很重要的宏定义以及一些结构体的信息。 总的原则是:对外的接口函数或者是接口变量的信息一定要出现在头文件里,不该让外界知道的信息就不应该出现在头文件里。这样,只要包含(#include “*.h”)这份模块头文件我们自身模块或者外界就能正确的调用接口功能。一般一个.C源文件的对应一个.h 头文件。 例如定义一个uart.c文件的头文件uart.h的内容如下: #ifndef _UART_H_ #define _UART_H_ extern UART_PutChar(char NewValue) ; #endif 在接口函数UART_PutChar前面添加了extern 修饰符表明其是一个外部函数,可以被外部其它模块进行调用。 #ifndef _UART_H_ #define _UART_H_ #endif 这个条件编译和宏定义是为了防止重复包含。假如有两个不同源文件需要调用UART_PutChar这个函数,他们分别都通过#include “uart.h”把这个头文件包含了进去。在第一个源文件进行编译时候,由于没有定义过 _UART_H_,因此 #ifndef _LCD_H_ 条件成立,于是定义_UART_H_并将下面的声明包含进去。在第二个文件编译时候,由于第一个文件包含时候,已经将_LCD_H_定义过了,因此#ifndef _LCD_H_ 不成立,整个头文件内容就没有被包含。假设没有这样的条件编译语句,那么两个文件都包含了extern UART_PutChar(char cNewValue) 就会引起重复包含的错误。 头文件还可以对数据类型别名进行声明。这样提高了程序的可移植性,因为不同数据类型在不同的编译器上或不同的处理器上的范围不同。那么移植时很可能我们就需要在源文件中到处修改变量的类型定义。 将常用的数据类型全部采用此种方法定义,形成一个头文件,这样很方便编程时直接调用。 例如 typedefine.h 其内容如下: #ifndef _TYPE_DEFINE_H_ #define _TYPE_DEFINE_H_ typedef unsigned int uint16; typedef unsigned int UINT; typedef unsigned int uint; typedef unsigned int UINT16; ... #endif 头文件使用的注意事项: 1.头文件中不可以放变量的定义!一般头文件中只是放变量的声明,因为头文件要被其他文件包含#include,如果把定义放在头文件的话,就不能避免多次定义变量。 三个例外: 1)值在编译时就已知的const变量的定义可放在头文件中,如:const int num=10; 2)类的定义可放在头文件中。 3)inline函数。 2.定义和声明是不同的。定义只能出现一次,而声明可以出现多次。 下面的语句是定义,不能放在头文件中: extern??int ival=10; //虽然ival声明为extern,但是它初始化了,代表这是个定义。 double fica_rate;??//fica_rate虽然没有初始化,但是没有extern。所以仍是定义。 extern int x; //变量是声明,并未实际分配地址。 void print(); //函数声明,并未产生实际目标代码 int x; int x=3; void print() { }; //均为定义。 3.只有全局变量并且没有被static声明的变量才能声明为extern。所以,如果你不想自己源文件中全局变量被其他文件引用,你就可以给变量加上static声明。 4. static全局变量是有文件作用域的。在a.c中用了,在其他文件中就不能使用了。static变量一般放在.cpp或者.c文件中。不放在.h文件中。

文档评论(0)

1亿VIP精品文档

相关文档