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

          新聞中心

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

          KEIL C51中的多模塊應用

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

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

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

          #include /*引用標準庫的頭文件*/

          #include “myheader.h” /* 引用非標準庫的頭文件*/

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

          class Box /*類結構聲明*/
          {

          };
          #endif
          模塊化的程序是黑盒,只向外提供接口(全局變量、外部函數),而不需要讓調用者了解其中過程。盡可能地少定義接口有利于保持模塊的獨立性(不需要讓使用者知道的內部函數與靜態(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 ); /*內部函數在.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,就可以防止這種重定義錯誤。在預編譯的過程中,執(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ū)

          關閉
          看屁屁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); })();