新聞中心

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

KEIL C51中的多模塊應用

作者: 時間:2016-11-18 來源:網絡 收藏
通常一個C51程序工程按功能可以分成多個模塊, 一個模塊通常由兩個文檔組成一個頭文件 *.h, 對模塊中的數(shù)據(jù)結構和函數(shù)原型進行描述;另一個為C文件*.C , 對數(shù)據(jù)實例或對象進行定義,以及函數(shù)算法的具體實現(xiàn),如I2C.C, ADC.C, DAC.C, LED.C 等,為了文件的調用,我們要為每個模塊定義一個頭文件,以I2C.C 來說,定義I2C.H。

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

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

#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



關鍵詞: KEILC51多模塊應

評論


技術專區(qū)

關閉