C語言巨集定義拓展

2021-10-07 23:23:27 字數 2963 閱讀 7362

巨集定義的淺顯理解。

引數巨集編譯可以完成一些簡單的邏輯控制,其具體形式如下:

#define text(a)   if(a) printf("yes!");\

else printf("no~");

void

main

(void

)

其中反斜槓在c中表示換行符,其後不可新增任何字元,空格也不允許。

這樣的巨集定義有點像乙個小函式,其中text接收乙個值,這個值會被後面的條件語句判斷和執行,所得結果為

yes
#ifndef _bsp_led_

#define _bsp_led_

#endif

這樣的條件巨集編譯可以保證**不復用。

在c語言中已經內建好了一些巨集,這些巨集用於列印可以用於除錯程式。這些巨集在使用時都要用 雙引號 ("")括起來才可生效,(為了和printf中的字元區別開來。

其中\_\_line__不可直接在雙引號中使用,需要用作為printf的引數傳入。這時就不需要雙引號區別了。巨集描述

__date__

顯示當前日期

__time__

顯示當前時間

__file__

顯示**所在檔案

__line__

顯示**行

#define debug printf(" "__date__" \n\

"__time__" \n\

"__file__" \n\

%d ",__line__)

void

main()

結果:

jul 19

202020:

35:52d:\vscode\vs-code-c\text.c

9

巨集中可以帶上引數,注意帶參巨集的引數在使用時需要用雙引號和printf中的字元區別開來。

#define debug(x,y)  printf(" "x " "y"" )

intmain

(int argc,

char

**ar**)

#define debug(x,arg...)  printf(""x"",##arg)

intmain

(int argc,

char

**ar**)

x為巨集的引數,在呼叫時必須填入。而arg…為可變引數,可以傳入任意多個(可以不填)。因為可變引數的存在,printf的參數列中要有##arg

因為可變引數的存在,呼叫這個巨集時,x可以代入一些可變引數,而arg…位置傳入的引數將會填入這些可變引數中。

如本程式中,對x傳入了一些字串,其中有可變參量%s; 這個可變引數的值由後面的字串給出。

得到結果:

my name is xyz
可變引數可以傳入多個,非常amazing;

#define debug(x,arg...)  printf(""x"",##arg)

intmain

(int argc,

char

**ar**)

得到結果

my name is xyz,king of the universe.
把條件巨集編譯,帶參巨集 和預製巨集結合在一起就有不一般的風味。

先看這樣一段**:

#define debug(format) printf(" "__file__" --- %d",format)

void

main()

結果:

d:\vscode\vs-code-c\text.c --

-666

通過這個巨集我們可以列印出**所在檔名稱,並在其後新增想一並列印出的附帶語句。但是,仍有不滿意,這裡附帶語句只能是數字,而且只能傳入乙個。我們想要想隨意列印,不限於一句話,固定的資料樣式。

通過可變引數列表可以解決這個問題。

#define debug(format,arg...) printf(" "__file__" "format" ",##arg)

void

main()

結果:

d:\vscode\vs-code-c\text.c --

-666

--- dangerous!

這樣就可以完成隨意列印的需求,而且可變引數的引入,使得列印資訊可以更多,更實時。

這些除錯資訊可能在產品開發時需要用到,但開發完後給客戶的產品不需要這些除錯資訊。把除錯資訊一條條刪去太麻煩,可以採用條件巨集編譯,在完成開發後修改巨集,簡單快速完成除錯資訊的去除。

#define _debug_

#ifdef _debug_

#define debug(format,arg...) printf(" file:"__file__" --- \

line:%d --- "format"\n ",__line__,##arg)

#else

#define debug(format,arg...)

C語言巨集定義

c語言有很多預處理命令,如包含命令 include,巨集定義命令 define。預處理命令在程式編譯之前被編譯器處理,而巨集定義也在此時被替換。或c 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集...

C語言巨集定義

乙個巨集定義的作用域是從定義處到 undef處或檔案結尾。undef num 現在此處num沒有定義。1.ifdef num 如果num有巨集定義就編譯此處。else 如果num沒有巨集定義就編譯此處 endif 不論num 有沒有巨集都編譯,即判斷體已結束。ifndef num 如果num沒有巨集...

C語言(巨集定義)

巨集定義是c提供的三種預處理功能 巨集定義 檔案包含 條件編譯 的其中一種。c語言執行的流程 1 編譯 形成目標 obj 2 連線 將目標 與c函式庫連線合併,形成最終的可執行檔案 3 執行 巨集定義也叫做 巨集替換 預編譯指令 作用 使用define指令 1 定義標示,防止檔案重複引入 如 ifd...