c/c++宏函数和多参宏函数
生活随笔
收集整理的這篇文章主要介紹了
c/c++宏函数和多参宏函数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
記住宏函數(shù)并非真函數(shù),就是一個(gè)字符串的替代動(dòng)作,預(yù)編譯階段處理成真代碼
1:基礎(chǔ)宏函數(shù)
#include <stdio.h> #include <stdlib.h> #include <unistd.h>//宏的定義 // 形式: // #define 宏名稱 替換主體//宏函數(shù)的特點(diǎn): // 1: 效率高,非真函數(shù),只是字符串替換, 所以結(jié)尾";"可有可無 // 2: 可重復(fù)調(diào)用。 // 3: 核心是字符串替換操作,只是預(yù)編譯階段進(jìn)行的簡單的替換,宏也不是類型定義。 // 4:由于是字符串替換,必須要注意結(jié)合順序,給足括號(hào),防止意外。 // 5: 宏 起到指揮編譯具體目標(biāo)的作用,如#ifdef,可見 宏 的主場是預(yù)編譯階段。 // 6:輔助實(shí)現(xiàn)了可變數(shù)量參數(shù)功能//部分預(yù)定義宏,在預(yù)編譯階段轉(zhuǎn)為實(shí)際的代碼 // 本機(jī)日期 __DATE__ // 文件名 __FILE__ // 行號(hào) __LINE__ // 本機(jī)時(shí)間 __TIME__#define sqr(x) (x)*(x) //一定要注意括號(hào)給足#define my_pt(x) printf("%s %s\r\n",x,__DATE__)int main(int argc,char** argv) {printf("ret = %d\r\n",sqr(5+1)); printf("%s\r\n",__DATE__);printf("%s\r\n",__TIME__);printf("%s\r\n",__FILE__);printf("%d\r\n",__LINE__);my_pt("this define means string exchange=> ");return 0; }2:hentai喜歡寫的多參宏函數(shù)
#include <stdlib.h> #include <stdio.h> #include <unistd.h>//__VA_ARGS__需和define一起使用:將左側(cè)宏名稱中的...原樣抄到右邊的__VA_ARGS__地方 #define PT(...) printf(__VA_ARGS__) //原樣全抄,其實(shí)并沒啥意義,只是換了個(gè)調(diào)用名字,在宏內(nèi)不能增加操作了,還算啥“宏函數(shù)” #define PT_A(...) printf(__VA_ARGS__"\r\n") //簡單追加,記住宏的內(nèi)核是簡單替換 #define PT_B(...) printf("fun in %s,"__VA_ARGS__"\r\n",__FILE__) //將傳入的替換,并且再做兩側(cè)追加系統(tǒng)預(yù)定義宏#define LT(fm,...) printf(fm,__VA_ARGS__) // #define LT(fm , ...) printf(fm,__VA_ARGS__,__FILE__)//無法做追加操作,無法編譯,其實(shí)是替換后的編碼格式不對(duì)了 // #define LT(fm , ...) printf(fm,__FILE__,__VA_ARGS__)//無法做追加操作// #define RT(fm,...) printf(fm,##__VA_ARGS__) //單獨(dú)的##__VA_ARGS__沒啥意義 //因?yàn)槭呛诵氖穷A(yù)編譯的字符串替換操作,所以“,”會(huì)導(dǎo)致決定是否能編譯,即決定編碼內(nèi)容格式。 #define RT_A(fm,...) printf(fm"fun in %s,line %d:\r\n",##__VA_ARGS__,__FILE__,__LINE__) #define RT_B(fm,...) printf("fun in %s,line %d:\r\n"fm,__FILE__,__LINE__,##__VA_ARGS__) //調(diào)整替換追加順序也可以 //關(guān)鍵處:fm"fun in %s,line %d:\r\n",##__VA_ARGS__ //關(guān)鍵處的關(guān)鍵##__VA_ARGS__ //1:如果可變參數(shù)被忽略或?yàn)榭?#xff0c;## 操作將使預(yù)處理器(preprocessor)去除掉它前面的那個(gè)逗號(hào) //ep: RT_A("this is const"); =>printf("this is const""fun in %s,line %d:\r\n",__FILE__,__LINE__) //2:如果你在宏調(diào)用時(shí),確實(shí)提供了一些可變參數(shù),GNU CPP 也會(huì)工作正常,它會(huì)把這些可變參數(shù)放到逗號(hào)的后面,匹配前面的fm規(guī)定格式 //ep: RT_A("a=%d,b=%d,sum=%d\r\n",a,b,a+b); => printf("a=%d,b=%d,sum=%d\r\n""fun in %s,line %d:\r\n",,a,b,a+b,__FILE__,__LINE__)//ep:前側(cè)可再多定義一個(gè)"參數(shù)",format位置也可以調(diào)換,但都是和" %s-%d:"連體的。 //#define LOG(Priority,format,...) syslog(LOG_DEBUG," %s-%d:" format,__FILE__,__LINE__,##__VA_ARGS__) //猜測這個(gè)順序也行#define LOG(Priority,format,...) syslog(LOG_DEBUG,format" %s-%d:",##__VA_ARGS__,__FILE__,__LINE__) int main(int argc, char ** argv){int a = 10; int b = 20;PT("this is a simple copy from ... to __VA_ARGS__"); //只能直接copyPT_A("this is a simple copy from ... to __VA_ARGS__");//注意這里存在一個(gè)前提,宏函數(shù)必定會(huì)對(duì)傳入數(shù)據(jù)進(jìn)行操作,不存在直接完全拷貝的情況,這是無意義的PT("this is a simple copy from ... to __VA_ARGS__ %d %d",a,b);//能過編譯,但這種完全直接拷貝做法毫無意義// PT_A("this is a simple copy from ... to __VA_ARGS__ %d %d",a,b); //編譯不通過,在宏函數(shù)中對(duì)傳入變量進(jìn)行了操作,就報(bào)字符串連接錯(cuò)誤了 // PT_B("this is a simple copy from ... to __VA_ARGS__%d %d",a,b); //編譯不通過,在宏函數(shù)中需要操作變量時(shí),出現(xiàn)同上問題printf("\r\n");LT("a=%d,b=%d,sum=%d\r\n",a,b,a+b);//替換了兩段東西,前半段fm,后半段...,所以后半段的,分隔是可變的,反正都去替換為__VA_ARGS__了,所以后半段參數(shù)量可變。//但是不能在宏函數(shù)中追加別的動(dòng)作了printf("\r\n");RT_A("this is const");RT_A("a=%d,b=%d,sum=%d\r\n",a,b,a+b);RT_B("a=%d,b=%d,sum=%d\r\n",a,b,a+b); }結(jié)合下面兩個(gè)地址看:
https://www.codersrc.com/archives/9450.html
https://www.codersrc.com/archives/9480.html
常見還有常見宏使用的#,##用法:
#:
把后面的參數(shù)換成參數(shù)字符串
//和define定義的宏函數(shù)一起使用,獲得 傳入宏函數(shù)的參數(shù)的變量名。 #define new_print(A) printf(%s %d \r\n“,#A,A); int main(){int age = 10;new_print(age); } =》 age 10##:(宏函數(shù)內(nèi)的粘接劑)
#define new_fun(parm) print##parm("this is a printf\r\n"); int main() { //new_fun(oh); //無法編譯通過 new_fun(f);return 0; } =》this is a printf即等于最終執(zhí)行了printf("this is a printf\r\n");
linux內(nèi)核中的#define有大量出現(xiàn)##這個(gè)粘接劑ep:
#define MAX8925_LDO(_id, min, max, step) \ { \.desc = { \.name = "LDO" #_id, \.ops = &max8925_regulator_ldo_ops, \.type = REGULATOR_VOLTAGE, \.id = MAX8925_ID_LDO##_id, \.owner = THIS_MODULE, \}, \.step_uV = step * 1000, \.vol_reg = MAX8925_LDOVOUT##_id, \.vol_shift = 0, \.vol_nbits = 6, \.enable_reg = MAX8925_LDOCTL##_id, \.enable_bit = 0, \ }??
總結(jié)
以上是生活随笔為你收集整理的c/c++宏函数和多参宏函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 核心网学习1
- 下一篇: Anaconda安装错误