#define定義的巨集可以出現在程式的任何位置
#define定義之後的**都可以使用這個巨集
#define定義的巨集常量本質為字面量
#define表示式不能出現遞迴定義
ansi c 規定了以下幾個預定義巨集,它們在各個編譯器下都可以使用:
line:表示當前源**的行號;
file:表示當前原始檔的名稱;
date:表示當前的編譯日期;
time:表示當前的編譯時間;
stdc:當要求程式嚴格遵循ansi c標準時該標識被賦值為1;
__cplusplus:當編寫c++程式時該識別符號被定義。
__win32:當在window平台下編寫程式時被定義
linux:當在linux平台下編寫程式時被定義
條件編譯在行為上類似c語言中的if…else…;
條件編譯在預處理期進行分支判斷;
我們可以通過命令列來定義巨集
格式:gcc –dmacro=value file.c 或者 gcc –dmacro file.c
include將已經存在的檔案內容嵌入到當前檔案中來;間接包含同樣會嵌入檔案內容;多次包含了同一檔案會嵌入多次,出現重複定義,程式出錯。
現代軟體工程涉及到的檔案眾多,為了避免重複呼叫標頭檔案,防止程式出錯,一般在標頭檔案前使用如下語句:
#ifndef headname_h
#define headname_h
//標頭檔案體
#endif
#error用於生成乙個編譯錯誤訊息
用法:#error message message是我們要輸出的語句,但不需要雙引號
類似的:#warning用於生成編譯警告
例如:
#ifndef __cplusplus
#error this file should be processed with c++ compiler.
#endif
//__cplusplus是c++內建的巨集,在c語言中沒有定義,如果使用c編譯,則#error執行,編譯無法完成。
#line用於強制自定義新的行號和編譯檔名,並對源程式的**進行重新編號。
用法:#line number filename //filename可省略
#line編譯指示字的本質是重定義_line_和_file_
#pragma用於指示編譯器完成一些特定的動作
#pragma所帶有的指示字很多是編譯器特有的,不可移植
編譯器將忽略不認識的#pragma指令
#pragma message用於在編譯時輸出訊息到編譯輸出視窗
#pragma pack(number)用於指定記憶體以number位元組對齊
不同型別的資料在記憶體中按照一定的規則排列
下面是以4位元組對齊的例子:
需要進行記憶體對齊的原因:cpu對記憶體的讀取不是連續的,而是分成塊讀取的,塊的大小只能是1、2、4、8、16…位元組;當被讀取的資料元素未進行記憶體對齊時,需要2次匯流排週期訪問記憶體,效能上有影響;同時對於一些硬體平台而言,只能從規定的相對位址讀取特性型別的資料,否則會產生硬體異常。
編譯器在預設情況下進行4位元組記憶體對齊。
#識別符號用於在預處理期將巨集引數轉換成字串;
#的轉換作用是在預處理期完成的,因此只在巨集定義中有效。
例如:
#define call(f, p) (printf(「call function %s\n」, #f), f(p))
intsquare
(int n)
intmain()
##用於在預處理期粘連兩個識別符號
#的轉換作用是在預處理期完成的,因此只在巨集定義中有效
例如:
#define struct(type) typedef struct _tag_##type type;\
struct _tag_##type
struct
(student)
;int
main()
C語言中巨集定義與使用分析
事物的難度遠遠低於對事物的恐懼!這個章節我們來談一談c語言中的巨集定義與使用分析,相信每個學過c的都知道,在c中,巨集具有如下三個特性 define是預處理器處理的單元實體之一 define定義的巨集可以出現在 程式的任意位置 define定義之後的 都可以使用這個巨集 而在c語言中,我們常常用 d...
C語言巨集定義的使用
寫好c語言,漂亮的巨集定義很重要,使用巨集定義可以防止出錯,提高可移植性,可讀性,方便性 等等。下面列舉一些成熟軟體中常用得巨集定義。1,防止乙個標頭檔案被重複包含 ifndef comdef h define comdef h 標頭檔案內容 endif 2,重新定義一些型別,防止由於各種平台和編譯...
C語言高階 21 巨集定義與使用分析
define是預處理器處理的單元實體之一 define定義的巨集可以出現在程式的任意位置 define定義之後的 都可以使用這個巨集。define定義的巨集常量可以直接使用 define定義的巨集常量本質為字面量 不占用記憶體 唯讀儲存區 和const常量 變數,佔記憶體 的本質區別 下面的巨集定義...