C語言 預處理二(巨集定義 define)

2021-09-07 05:45:13 字數 2844 閱讀 3909

//

#define 巨集定義(巨集定義一般大寫)

//知識點一-->#define的作用域:從#define開始,從上往下,如果遇到#undef就到#undef處結束,如果沒有就是作用於當前整個檔案

#include

#include

//知識點二-->巨集定義作用

//巨集定義作用1:起到替換作用,可以定義常量

#define x 10

//巨集定義作用2:替換**的任意部分(一般用於易語言,或者加密**)

#define 水乃萬物之源 main

//注意:巨集定義不是普通c 語句,在行末不必加分號,如加上分號則連分號也一起置換

#define y 100;

//知識點三-->帶引數的巨集定義(可以部分替代函式呼叫)

//①帶引數的巨集僅僅是替換,不求出實際引數的值,函式呼叫時,會計算引數的值

//②函式呼叫時會給引數分配記憶體,巨集僅僅是替換,不占用記憶體

//③函式有返回值的概念,巨集沒有返回值的概念,返回的是乙個表示式,表示式的結果等價於函式的返回值

//④函式呼叫時是有型別的,巨集替換不需要型別

//⑤巨集替換展開時**變長,函式呼叫不會

//函式呼叫時跳轉,返回耗費時間,占用資源

//多個函式呼叫會讓程式執行時間增加,不影響預處理時間

//多個巨集呼叫,會讓預處理時間增加,執行時間會短

#define fl(x) x*x

//求兩個數的最小數

#define mymin(x,y) x>y?y:x

#define mytex(x,y) x*y

#define mytex2(x,y) (x)*(y)

//#define mytex2((x),(y)) (x)*(y) 這樣的巨集定義是錯誤的,帶引數的巨集的引數上不可以有()

//知識點四-->巨集定義語句中#的作用是將引數變成字串

#define mytef(x) printf("%s\n",#x)

#define mytef2(x) printf("%s---%d\n",#x,x)

//知識點五-->在c語言的巨集中,"##"被稱為 連線符

//它是一種預處理運算子,用來把兩個語言符號組成單個語言符號

//這裡的語言符號不一定是巨集的變數,"##"運算子可以將兩個記號(例如識別符號)「粘」在一起,成為乙個記號

//例子:

#define l(x) s##x //

例如l(1)就等價於s1

#define l1(x) 人##x //

例如l(1)就等價於人1

#define pn(x) etes##x //

例如l(1)就等價於人1

//注意:"##"運算子不能作為第乙個或者最後乙個元素存在

//#define pn2(x) ##x 報錯

//#define pn2(x) x## 報錯(直接執行並沒有錯,應該##會把「報錯」兩個字當成乙個符號)

//如果帶引數的巨集定義比較長,可以使用'\'連線

#define mytre(x) if(x>1)\

else

void

go1()

void

etes1()

void

etes2()

void

水乃萬物之源();

//x = 5; 報錯: 錯誤 1 error c2106 : 「 = 」 : 左運算元必須為左值 ,說明x是個常量

//printf("%d", y);報錯:錯誤 2 error c2059: 語法錯誤:「)」

//因為這裡y是100;

printf(

"%d\n

", x);

printf(

"%d\n

", z);//

列印0,因為這裡z是double型別的

//注意:巨集展開只是種簡單的代換,字串中可以包含任何字元,

//可以是常數,也可以是表示式,預處理器進行巨集展開時並不進行語法檢查。

#undef x//

結束x的巨集定義

//printf("%d\n", x); 報錯

//帶引數的巨集定義

printf("

%d\n

", fl(3

)); printf(

"%d\n

", mymin(3,8));//

列印3printf(

"%d\n

", mytex(1+7, 2+7));//

列印22

//注意:define只會替換,所以 mytex(1+7, 2+7))等價於1+7*2+7

printf("

%d\n

", mytex2(1 + 7, 2 + 7));//

列印72

//巨集定義中#的應用

mytef(你好);//

列印「你好」

//巨集定義中#還應用於列印變數的名字

int a1 = 9

; mytef2(a1);

mytre(2)

//"##"運算子的使用

int l(1), l1(1

);

//這裡的l(1)就是s1

s1 = 10

; 人1 = 3

; printf(

"l(1)的值是%d\n

",l(1

)); mytef2(l1(

1));

//"##"運算子用於呼叫各種函式

pn(1

)();

//pn(1)相當於etes1

system(

"pause");

}

C語言 巨集定義,預處理巨集

巨集是學習任何語言所不可缺少的,優秀的巨集定義可以使得 變得很簡潔且高效,有效地提高程式設計效率。巨集是一種預處理指令,它提供了一種機制,可以用來替換源 中的字串,直譯器或編譯器在遇到巨集時會自動進行這一模式替換 c語言有簡單的巨集系統,由編譯器或彙編器的預處理器實現。c的巨集預處理器的工作只是簡單...

c語言預處理 巨集定義

個人筆記 巨集定義對於用c語言程式設計的人是經常用,這裡只講使用中需注意的問題點和方便的用法。1.巨集擴充套件中空格對擴充套件結果的影響 define a y a expanded y a x 被擴充套件為 a expanded x define a y a expanded y a x 被擴充套件...

C語言 預處理和巨集定義

今天分享一點c語言的預處理還有巨集相關的內容。目錄 預處理和巨集定義 一 乙個c程式的誕生 1 預編譯階段 c i 2 編譯階段 i s 3 彙編階段 s o 4 鏈結階段 該程式的所有.o exe 1 c語言中部分內建巨集 2 巨集的功能 1 使用巨集定義常量 2 使用巨集重新命名運算子 3 使用...