C語言巨集的使用分析

2021-10-08 15:44:40 字數 2271 閱讀 5661

#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常量 變數,佔記憶體 的本質區別 下面的巨集定義...