巨集定義及使用分析
1、巨集定義理解
1)表達形式:#define 標示符 字串
2)巨集定義是用巨集名來表示乙個字串,是一種簡單的代換,字串中可以
含任何字元,可以是常數,也可以是表示式,預處理時不作任何檢查,編譯時才能查出錯誤。
3)巨集定義不是說明或語句,在行末不需要加分號;
4)巨集定義必須寫在函式外,其作用域 為巨集定義命令起到源程式結束,如要提前結束,可以運用#undef命令。
2、巨集定義分類
1)無引數定義
a.一般表示式:#define 巨集名 字串;
b.此時的巨集定義為簡單的字元代換,不做任何運算。
2)有引數定義
a.一般表示式:#define 巨集名(行參表)字串
b.其可以傳遞引數,但也是不做任何計算,純代換。
3、巨集定義常用示例
1)防止乙個標頭檔案被重複包含
#ifndef comdef_h
#define comdef_h
//標頭檔案內容
#endif
2)重新定義一些型別
防止由於各種平台和編譯器的不同,而產生的型別位元組數差異,方便移植。
3)返回陣列元素的個數
#define arr_size(a) (sizeof((a))/sizeof((a[0])))
4)日誌巨集定義及使用,可以用於**的除錯
ansi標準說明了五個預定義的巨集名。它們是:
__line__
__file__
__date__
__time__
__stdc__
c++中還定義了 __cplusplus
如果編譯器不是標準的,則可能僅支援以上巨集名中的幾個,或根本不支援。記住編譯程式也許還提供其它預定義的巨集名。
__line__ 及 __file__ 巨集指示,#line指令可以改變它的值,簡單的講,編譯時,它們包含程式的當前行數和檔名。
__date__ 巨集指令含有形式為月/日/年的串,表示原始檔被翻譯到**時的日期。
__time__ 巨集指令包含程式編譯的時間。時間用字串表示,其形式為: 分:秒
__stdc__ 巨集指令的意義是編譯時定義的。一般來講,如果__stdc__已經定義,編譯器將僅接受不包含任何非標準擴充套件的標準c/c++**。如果實現是標準的,則巨集__stdc__含有十進位制常量1。如果它含有任何其它數,則實現是非標準的。
__cplusplus 與標準c++一致的編譯器把它定義為乙個包含至少6為的數值。與標準c++不一致的編譯器將使用具有5位或更少的數值。
可以定義巨集,例如:
當定義了_debug,輸出資料資訊和所在檔案所在行
#ifdef _debug
#define debugmsg(msg,date) printf(msg);printf(「%d%d%d」,date,_line_,_file_)
#else
#define debugmsg(msg,date)
#endif
4、#define和typedef區別
1) #define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。
2)typedef是在編譯時處理的。它在自己的作用域內給乙個已經存在的型別乙個別名。
巨集定義與使用分析
巨集定義常量 define巨集定義常量可以出現在 的任何地方 define從本行開始,之後的 都可以使用這個巨集常量 以上巨集定義都正確 最後乙個巨集定義採用了接續符 等同於 define path 3 d delphi ctopic3.ppt 巨集定義表示式 define表示式有函式呼叫的假象,卻...
19 巨集定義使用分析
巨集開始給我的兩個印象 1 可以用來定義常量 2 定義 塊 1 c語言中的巨集定義 define 是預處理器處理的單元實體之一 define 定義的巨集可以出現在程式的任意位置 define 定義之後的 都可以使用這個巨集 2 定義巨集常量 define 定義的巨集常量可以直接使用 define 定...
offsetof巨集定義分析
type是結構體型別,member是結構體中的乙個元素的元素名 define offsetof type,member int type 0 member 拆分為以下三個個步驟 1 type 0 將type型別結構體變數的首位址變為0 個人理解將其跟陣列比較 不一定正確 把0位址強制型別轉換成乙個指...