KEIL C51中的多模塊應用
#ifndef GRAPHICS_H /*防止graphics.h被重復引用*/
#define GRAPHICS_H
#include
…
#include “myheader.h” /* 引用非標準庫的頭文件*/
…
void Function1(…); /*全局函數(shù)聲明*/
…
class Box /*類結構聲明*/
{
…
};
#endif
模塊化的程序是黑盒,只向外提供接口(全局變量、外部函數(shù)),而不需要讓調用者了解其中過程。盡可能地少定義接口有利于保持模塊的獨立性(不需要讓使用者知道的內部函數(shù)與靜態(tài)全局變量不需要在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 ); /*內部函數(shù)在.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 ); /*內部函數(shù)在.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的時候,先根據(jù)#include "b.h"去編譯b.h這個問題,再根據(jù)b.h里面的#include "d.h",去編譯d.h的這個文件,這樣就把d.h里面的class D編譯了;
然后再根據(jù)a.cpp的第二句#include "c.h",去編譯c.h,最終還是會找到的d.h里面的class D,但是class D之前已經編譯過了,所以就會報重定義錯誤。
加上ifndef/define/endif,就可以防止這種重定義錯誤。在預編譯的過程中,執(zhí)行到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
評論