一般一个C51程序工程按功用能够分红多个模块, 一个模块一般由两个文档组成一个头文件 *.h, 对模块中的数据结构和函数原型进行描绘;另一个为C文件*.C , 对数据实例或目标进行界说,以及函数算法的详细完成,如I2C.C, ADC.C, DAC.C, LED.C 等,为了文件的调用,咱们要为每个模块界说一个头文件,以I2C.C 来说,界说I2C.H。
#ifndef GRAPHICS_H /*避免graphics.h被重复引证*/
#define GRAPHICS_H
#include
…
#include “myheader.h” /* 引证非规范库的头文件*/
…
void Function1(…); /*大局函数声明*/
…
class Box /*类结构声明*/
{
…
};
#endif
模块化的程序是黑盒,只向外供给接口(大局变量、外部函数),而不需求让调用者了解其间进程。尽可能地少界说接口有利于坚持模块的独立性(不需求让运用者知道的内部函数与静态大局变量不需求在H文件中给出以避免运用者疑问)在需求调用此模块的文件中写入include句子。一个好的工程,H文件的安排是很明晰的,只看H文件就能够写主程序调用相应的C模块。
头文件的格局如下(I2C.H为例):
********************************************************************
#ifndef I2C_H /*是否没有界说过 “I2C_H”, 避免重界说*/
#define I2C_H /*界说”I2C_H” */
……….
bit SetSDA ( bit Up_Down );
bit SetSCL ( bit Up_Down);
#endif
**********************************************************************
I2C.C格局如下:
**********************************************************************
#include < stdio.h >
#include “I2C.h”
void SendByte ( uchar c ); /*内部函数在.H 头文件中不描绘*/
bit SetSDA ( bit Up_Down ) { ………. };
bit SetSCL ( bit Up_Down) { ………. };
**********************************************************************
别的一种写法:
=============================
#ifndef I2C_H
#define I2C_H
……….
exten bit SetSDA ( bit Up_Down );
exten bit SetSCL ( bit Up_Down);
#endif
=================================================
I2C.C格局如下:
=================================================
#include < stdio.h >
void SendByte ( uchar c ); /*内部函数在.H 头文件中不声明*/
bit SetSDA ( bit Up_Down ) { ………. };
bit SetSCL ( bit Up_Down) { ………. };
=================================================
举个比如,趁便剖析一下ifndef/define/endif:
假定你的工程里边有4个文件,分别是a.cpp, b.h, c.h, d.h。
a.cpp的头部是:
#include “b.h”
#include “c.h”
b.h和c.h的头部都是:
#include “d.h”
而d.h里边有class D的界说。
这样一来, 编译器编译a.cpp的时分,先依据#include “b.h”去编译b.h这个问题,再依据b.h里边的#include “d.h”,去编译d.h的这个文件,这样就把d.h里边的class D编译了;
然后再依据a.cpp的第二句#include “c.h”,去编译c.h,终究仍是会找到的d.h里边的class D,可是class D之前现已编译过了,所以就会报重界说过错。
加上ifndef/define/endif,就能够避免这种重界说过错。在预编译的进程中,履行到include “C.h”时会由于在上一句的时分现已界说了class D这个宏,所以此刻的ifndef条件不满足,起到了避免重复引证头文件的作用。
#undef仅仅吊销掉掉本来界说的宏,
可是不会取消掉你现已用这个宏界说的变量
#define X extern
x int a;
#undef X
你依然能够运用这个a,但不能用X了,当然你再界说X成什么就随便了
你也能够再界说成
#define X extern
x int a;
#undef X
#define X int
X b;
#undef X