<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/315907.htm

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

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

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

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

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

          舉個例子,順便分析一下ifndef/define/endif:
          假設(shè)你的工程里面有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之前已經(jīng)編譯過了,所以就會報重定義錯誤。

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

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

          你仍然可以使用這個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)

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();