定義宏
預(yù)處理器不是編譯器侥钳,預(yù)處理器主要完成文本替換的操作诡曙,預(yù)處理器都是用 #xxx 的寫法
# include 導(dǎo)入頭文件
#if if判斷操作
#elif
#else
#ifndef 如果沒(méi)有定義這個(gè)宏
#define 定義了一個(gè)宏
#ifdef 如果定義了這個(gè)宏
#endif 結(jié)束if
#undef 取消宏定義
#programa 定義編譯器的狀態(tài)
頭文件經(jīng)常有類似的聲明
#ifndef TEMPC_CUSTOMPTR_H
#define TEMPC_CUSTOMPTR_H
#pragma once
// other code......
#endif //TEMPC_CUSTOMPTR_H
作用和含義
T2.h
#ifndef TEMPC_T2_H // 如果沒(méi)有定義這個(gè)宏 解決循環(huán)拷貝的問(wèn)題
#define TEMPC_T2_H // 我就定義這個(gè)宏
#ifndef isRelease // 如果沒(méi)有isRelease這個(gè)宏
#define isRelease 0 // 是否是正式環(huán)境下 【我就定義isRelease這個(gè)宏】
#if isRelease == true
#define RELEASE // 正式環(huán)境下 定義RELEASE宏
#elif isRelease == false
#define DEBUG // 測(cè)試環(huán)境下 定義DEBUG宏
#endif // 結(jié)束里面的if
#endif // 結(jié)束里面的if
#endif //TEMPC_T2_H // 結(jié)束外面的if
上面頭文件的聲明门怪,解決是循環(huán)引用問(wèn)題诅妹,比如芜抒,我們?cè)?項(xiàng)目文件珍策,ahead.h 引入了 a.cpp, 同時(shí)a.cpp 引入了ahead.h. 結(jié)果 宏定義是文本拷貝替換,就導(dǎo)致了循環(huán)引用宅倒,為了避免這種問(wèn)題發(fā)生需要定義這種宏定義
#include <iostream>
#include "T2.h"
using namespace std;
int main() {
// if 條件判斷
// ifdef xxx 是否定義了xxx這個(gè)宏
#ifdef DEBUG // 是否定義了DEBUG這個(gè)宏
cout << "在測(cè)試環(huán)境下攘宙,迭代功能" << endl;
// 省略 500行 ...
#else RELEASE
cout << "在正式環(huán)境下,功能上下中" << endl;
// 省略 500行 ...
#endif // 結(jié)束IF
}
宏的取消 #undef
#include <iostream>
using namespace std;
int main() {
int i = 1;
#ifndef DAVID // 如果沒(méi)有定義這個(gè)宏
#define DAVID // 我就定義宏
#ifdef DAVID // 是否定義了這個(gè)宏
for(int i = 0;i<6; ++i){
cout << "David ① " << i << endl;
}
#ifdef DAVID // 是否定義了這個(gè)宏
for(int i = 0;i<6;++i){
cout << "David ② " << i << endl;
}
#undef DAVID // 取消宏的定義拐迁,下面的代碼蹭劈,就沒(méi)法用這個(gè)宏了,相當(dāng)于:沒(méi)有定義過(guò)DERRY宏
#ifdef DAVID
cout << "你定義了DAVID宏" << endl;
#else
cout << "你沒(méi)有定義了DAVID宏" << endl;
#endif
#endif
#endif
#endif
return 0;
}
宏與編譯
- 預(yù)處理階段线召,處理宏(預(yù)處理器)
宏定義展開铺韧,比如#include<xxx.h> 將.h 拷貝到當(dāng)前文件。宏替換缓淹,就是在預(yù)處理去掉宏代碼哈打,變成宏定義的邏輯代碼。
預(yù)編譯 代碼的檢查
匯編階段
鏈接階段(生成靜態(tài)庫(kù)讯壶,后者動(dòng)態(tài)庫(kù))
可執(zhí)行文件
宏變量
宏變量 真實(shí)開發(fā)中:宏都是大寫
#include <iostream>
using namespace std;
#define VALUE_I 9527
#define VALUE_S "AAA"
#define VALUE_F 545.3f
int main() {
int i = VALUE_I; // 預(yù)處理階段 宏會(huì)直接完成文本替換工作料仗,替換后的樣子:int i = 9527;
string s = VALUE_S; // 預(yù)處理階段 宏會(huì)直接完成文本替換工作,替換后的樣子:string s = "AAA";
float f = VALUE_F; // 預(yù)處理階段 宏會(huì)直接完成文本替換工作伏蚊,替換后的樣子:float f = 545.3f;
return 0;
}
宏函數(shù)
優(yōu)點(diǎn)立轧,不會(huì)進(jìn)棧,出棧,直接文本替換氛改。不會(huì)有函數(shù)調(diào)用開銷匀借。
缺點(diǎn),會(huì)導(dǎo)致代碼的體積變大平窘,不停的拷貝文本代碼
#include <iostream>
using namespace std;
#define SHOW(V) cout << V << endl;
#define ADD(n1, n2) n1 + n2
#define CHE(n1, n2) n1 * n2 // 故意制作問(wèn)題吓肋,因?yàn)樗銛?shù)運(yùn)算規(guī)則有順序
#define LOGIN(V) if(V==1){ \
cout << "滿足 你輸入的是:" << V << endl; \
} else { \
cout << "不滿足 你輸入的是:" << V << endl; \
}// 這個(gè)是結(jié)尾,不需要加 \
int main() {
SHOW(8);
SHOW(8.8f);
SHOW(8.99);
int r = ADD(1, 2);
cout << r << endl;
r = ADD(1+1,2+2);
cout << r << endl;
r = CHE(1+1,2+2);// 文本替換 1+1*2+2 = 5
cout << r << endl;// 二義性瑰艘,我們邏輯是認(rèn)為8是鬼,但是實(shí)際是5
LOGIN(0);
LOGIN(0);
LOGIN(0);
LOGIN(0);
LOGIN(0);
LOGIN(0);
//LOGIN(0) 替換大量文本,代碼體積增大
return 0;
}