C語言 巨集定義 define的用法

2021-10-03 16:40:40 字數 2845 閱讀 1956

這種用法是最簡單最常見的一種方式,如下:

#define pai 3.14
注意

它的功能是在程式中若出現了pai,就把它替換3.14,示例程式如下:

#include

#define pai 3.14

// 不帶參巨集定義

intmain()

使用方法如下:

#define add(a,b) (a+b)
它的功能是計算a+b的結果,示例程式如下:

#include

#define add(a,b) (a+b)

intmain()

這裡需要注意的是,我們習慣上會把後面表示式添上括號,如(a+b),在本例中去掉這個括號也是可以的,但有些情況下會出現問題,如下:

#include

#define add(a,b) a+b

#define sub(a,b) a-b

intmain()

這個程式的功能是計算a+b乘以a-b的值,實際上程式的輸出結果為1,我們稍加思考發現本例中a+b>0a-b<0答案必然是負數,結果卻是正數,顯然出了問題,那麼再把表示式的括號加上試試看:

#define add(a,b) (a+b)

#define sub(a,b) (a-b)

程式執行後輸出結果為-3,可以口算發現此結果是正確的,出現問題的原因就要從#define預編譯指令的原理說起,在編譯乙個c語言程式時,第一步執行的是預編譯這個過程中會把#define中定義的巨集進行替換,如不加括號的程式中就替換成了如下:

printf

("%d"

, a+b*a-b)

;// 輸出結果為1

顯然根據數**算規則會先算乘法後算加法,所以結果為1,那麼加上括號的程式中替換後結果如下:

printf

("%d",(

1+2)

*(1-

2));

// 輸出結果為-3

先算括號裡的式子,整個式子的結果顯然為-3,通過本例可以發現為了避免替換後出現類似這種錯誤,盡量將表示式加上括號,特別是表示式中有多個變數時

帶參巨集定義和函式有點像,他們的區別如下

使用方法如下,在s前加上#,它的作用是將傳入的s轉換為字串

#define str(s) #s
示例程式如下,給出引數wuhan jia you,最後以字串的形式輸出來

#include

#define str(s) #s

intmain()

需要注意的是,轉換的是s,而不是s裡的值,見下面兩個程式:

// 程式1

#include

#define str(s) #s

intmain()

// 程式2

#include

#define str(s) #s

intmain()

第乙個程式輸出結果為s,第二個程式的輸出結果為n,可見這個用法就是你給它什麼,它就把它直接轉換為字串,不管它是不是變數

使用方法如下,在c的前面加上#@,它的作用是把c轉換為字元

#define str(c) #@c
注意:本用法不支援gcc編譯器,如在gcc編譯器下編譯,會出現下面的錯誤資訊error: '#' is not followed by a macro parameter,這個用法僅支援微軟系列(microsoft specific)

示例程式如下,給出引數1,最後把1轉換為字元1輸出:

#include

#define str(c) #@c

intmain()

關於它的轉換規則和3.1 字串轉換的類似

使用方法如下,在兩個引數中間新增##,它的作用是連線前後兩個引數,把它們變成乙個引數

#define cat(a,b) a##b
示例程式如下

#include

#define cat(a,b) a##b

intmain()

輸出結果為123456

c 巨集定義用法 define

巨集定義語法 define name stuff define pi 3.14 定義乙個m,值為3.14 define do forever for 定義乙個死迴圈 define reg register 定義reg來作為register的別名 define case break case 在swi...

c語言巨集定義 define

數值巨集常量 define 巨集定義可以定義在 的任何地方,從本行巨集定義開始到後面 都認識這個巨集 可以把任何東西定義成巨集。因為編譯器在預編譯的時候用真身替換替身,然而在 裡面卻又常用替身來幫忙。巨集定義是個演技高超的替身演員,但也會經常耍大牌的,我們慎用它。define pi 3.141592...

詳解C語言中的 define巨集定義命令用法

define 命令 define定義了乙個識別符號及乙個串。在源程式中每次遇到該識別符號時,均以定義的串代換它。ansi標準將識別符號定義為巨集名,將替換過程稱為巨集替換。命令的一般形式為 define identifier string 注意 1.該語句沒有分號。在識別符號和串之間可以有任意個空格...