巨集定義及使用分析

2021-07-12 03:56:12 字數 1645 閱讀 5444

巨集定義及使用分析

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位址強制型別轉換成乙個指...