//#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 使用...