一、背景 最近在跟一段系統級的代碼,和原來單純的下位機代碼相比,真的是劉姥姥進大觀園——看花了眼。相較於 之前所常見的各種下位機代碼,系統級代碼常常會出現深層次結構體嵌套,結構體內的各種回調函數導致對函數 指針的賦值調用也成為常態,以及各種各樣的宏定義等等,均讓人有一種眼前一亮、耳目一新的既視感。由於 對宏了解不多,也就對此處我在實際代碼碰到過的#define,#include,#undef的使用的其中一個目的做個 記錄。 二、正文 實際代碼如下: #define _MCARO_1 #include "Myheadfile.h" #undef _MACRO_1 緊接着的代碼: #define _MCARO_2 #include "Myheadfile.h" #undef _MACRO_2 出現這段代碼的作用即重復包含了兩次頭文件"Myheadfile.h",可意義在哪?接着跟頭文件內的代碼, 該頭文件的作用是聲明定義了一張類似於表格的變量,表格即是通過定義普通數組或者結構體數組來實現。而在 該頭文件內出現了如下宏: #if defined (_MCARO_1) ··· 對表格實際的各個變量的聲明; ··· #elif defined (_MACRO_2) ··· 對表格實際的各個變量的聲明; ··· 從代碼上來分析,重復包含兩次頭文件的意義就在於根據宏定義的不同來申請兩種不同的變量。 以我碰到的實際代碼來說,該工程實際上是要實現一個CANopen設備,CANopen設備通過對象字典來描述其功 能,以及通過對象字典來與外界交互,對象字典代碼上實現就相當於一個表格,(關於CANopen對象字典以后會另外 開篇博客詳述),在CANopen設備初始化的時候,CANopen設備會通過默認的對象字典來實現其預定義的功能,但在 CANopen設備實際運行起來時,又會按照不同的工業現場情況被CANopen主設備配置成適應當時需求的從設備,對象 字典內的參數也因此會被更改,但該設備被應用到其他場合時,它還是應該以默認的CANopen設備進行初始化。 上述代碼既是實現了這種需求: 當其"define_MACRO_1"時,在該頭文件內聲明的變量空間為CANopen默認的對象字典參數。 當其"define_MACRO_2"時,在該頭文件內聲明的變量空間為CANopen實際運行的可被更改的對象字典參數。
兩個對象字典參數並存於同一段代碼中,而互不干涉。 因此,綜上所述,#define,#include,#undef 在使用時,會在被包含的頭文件內按照定義的宏進行特定的 操作,而同時再被包含時,由於宏的不同,其不會出現再次重復定義的錯誤。 再補充一個帶參宏的用法: #define Test(par) Function(par); void Function(int par); int main(void) { Test(par); //中間若是加空格也可以調用Function(par); Test (par); } 也即是說,定義帶參數的宏,在定義時,宏與參數之間不得有空格,但在調用時,則可以有空格。 至此,記錄完畢。 記錄時間:2016-10-31 記錄地點:深圳WZ
