新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > KEIL C51中的多模塊應(yīng)用

KEIL C51中的多模塊應(yīng)用

作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
通常一個(gè)C51程序工程按功能可以分成多個(gè)模塊, 一個(gè)模塊通常由兩個(gè)文檔組成一個(gè)頭文件 *.h, 對(duì)模塊中的數(shù)據(jù)結(jié)構(gòu)和函數(shù)原型進(jìn)行描述;另一個(gè)為C文件*.C , 對(duì)數(shù)據(jù)實(shí)例或?qū)ο筮M(jìn)行定義,以及函數(shù)算法的具體實(shí)現(xiàn),如I2C.C, ADC.C, DAC.C, LED.C 等,為了文件的調(diào)用,我們要為每個(gè)模塊定義一個(gè)頭文件,以I2C.C 來(lái)說(shuō),定義I2C.H。

#ifndef GRAPHICS_H /*防止graphics.h被重復(fù)引用*/
#define GRAPHICS_H

本文引用地址:http://butianyuan.cn/article/201611/315907.htm

#include /*引用標(biāo)準(zhǔn)庫(kù)的頭文件*/

#include “myheader.h” /* 引用非標(biāo)準(zhǔn)庫(kù)的頭文件*/

void Function1(…); /*全局函數(shù)聲明*/

class Box /*類結(jié)構(gòu)聲明*/
{

};
#endif
模塊化的程序是黑盒,只向外提供接口(全局變量、外部函數(shù)),而不需要讓調(diào)用者了解其中過(guò)程。盡可能地少定義接口有利于保持模塊的獨(dú)立性(不需要讓使用者知道的內(nèi)部函數(shù)與靜態(tài)全局變量不需要在H文件中給出以避免使用者疑惑)在需要調(diào)用此模塊的文件中寫入include語(yǔ)句。一個(gè)好的工程,H文件的組織是很清晰的,只看H文件就能夠?qū)懼鞒绦蛘{(diào)用相應(yīng)的C模塊。
頭文件的格式如下(I2C.H為例):
********************************************************************
#ifndef I2C_H /*是否沒有定義過(guò) "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 ); /*內(nèi)部函數(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 ); /*內(nèi)部函數(shù)在.H 頭文件中不聲明*/
bit SetSDA ( bit Up_Down ) { .......... };
bit SetSCL ( bit Up_Down) { .......... };
=================================================

舉個(gè)例子,順便分析一下ifndef/define/endif:
假設(shè)你的工程里面有4個(gè)文件,分別是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的定義。

這樣一來(lái), 編譯器編譯a.cpp的時(shí)候,先根據(jù)#include "b.h"去編譯b.h這個(gè)問(wèn)題,再根據(jù)b.h里面的#include "d.h",去編譯d.h的這個(gè)文件,這樣就把d.h里面的class D編譯了;
然后再根據(jù)a.cpp的第二句#include "c.h",去編譯c.h,最終還是會(huì)找到的d.h里面的class D,但是class D之前已經(jīng)編譯過(guò)了,所以就會(huì)報(bào)重定義錯(cuò)誤。

加上ifndef/define/endif,就可以防止這種重定義錯(cuò)誤。在預(yù)編譯的過(guò)程中,執(zhí)行到include "C.h"時(shí)會(huì)因?yàn)樵谏弦痪涞臅r(shí)候已經(jīng)定義了class D這個(gè)宏,所以此時(shí)的ifndef條件不滿足,起到了防止重復(fù)引用頭文件的效果。

#undef只是撤消掉掉原來(lái)定義的宏,
但是不會(huì)取消掉你已經(jīng)用這個(gè)宏定義的變量
#define X extern
x int a;
#undef X

你仍然可以使用這個(gè)a,但不能用X了,當(dāng)然你再定義X成什么就隨便了
你也可以再定義成
#define X extern
x int a;
#undef X
#define X int
X b;
#undef X



關(guān)鍵詞: KEILC51多模塊應(yīng)

評(píng)論


技術(shù)專區(qū)

關(guān)閉