C語言宏定義的擴展定義講解
1. 常量宏定義
使用c中的#define 來定義一個常量來表示一年有多少秒
#define SECONDS_PER_YEAR (606024*365)UL
求圓的周長:
#define D® (r + r) //使用D(5) * 3.14 -----> (5 + 5) * 3.14
2. 定義宏函數(shù)
在定義宏函數(shù)時,最后一個表達式的結(jié)果就是宏函數(shù)的返回值
格式:
? #define 宏函數(shù)名(形參表) ({語句1;語句2;語句3…})
? 形參沒有數(shù)據(jù)類型,只有參數(shù)名
請寫一個“標(biāo)準(zhǔn)”的宏MIN,這個宏輸入兩個參數(shù)并返回較大較小值 #include <stdio.h> #define MIN(A,B) ({A<B?A:B;}) //宏定義分成多行書寫,行尾必須加續(xù)行符 #define MAX(A,B) ({int ret;\ if(A<B)\ ret=B;\ else \ ret=A;\ ret;}) int main(int argc, char const *argv[]) { int min=MIN(100,200); printf("min value=%d\n",min); int max=MAX(100,200); printf("max value=%d\n",max); return 0; }
3. 宏定義和#號結(jié)合
#可以將宏的參數(shù)轉(zhuǎn)換為一個字符串
#include <stdio.h> #define NAME "lisi" #define NAME1(n) n #define NAME2(n) #n int main(int argc, char const *argv[]) { printf("%s\n",NAME); //------>printf("%s\n","lisi"); printf("%s\n",NAME1(lisi)); //------>printf("%s\n",lisi); //error printf("%s\n",NAME2(lisi)); //------>printf("%s\n","lisi"); //error return 0; }
預(yù)處理之后的效果:
# 5 "test02.c" int main(int argc, char const *argv[]) { printf("%s\n","lisi"); printf("%s\n",lisi); printf("%s\n","lisi"); return 0; }
4. 宏定義和兩個#結(jié)合
兩個#可以實現(xiàn)字符串的拼接
// 將a和b代表的字符串拼接生成一個新的字符串
#define type(a, b) a##btype(uint, _t) ----> 預(yù)處理階段展開之后的結(jié)果 : uint_t
練習(xí):int型、short型、char型的數(shù)據(jù)比較大小
#include <stdio.h> #if 0 int max_int(int a,int b){ return a>b?a:b; } short max_int(short a,short b){ return a>b?a:b; } char max_int(char a,char b){ return a>b?a:b; } #endif //使用宏定義完成函數(shù)模板 #define MAX(T) T max_##T (T a,T b){return a>b?a:b;} //使用宏定義,定義max_int max_short max_char函數(shù) MAX(int) MAX(short) MAX(char) #define max_value(T) max_##T int main(int argc, char const *argv[]) { // printf("int max value =%d \n",max_int(10000,300000)); // printf("short max value =%d \n",max_short(100,300)); // printf("char max value =%c \n",max_char('a','b')); printf("int max value =%d \n",max_value(int)(10000,300000)); printf("short max value =%d \n",max_value(short)(100,300)); printf("char max value =%c \n",max_value(char)('a','b')); return 0; }
預(yù)處理代碼:
int max_int (int a,int b){return a>b?a:b;} short max_short (short a,short b){return a>b?a:b;} char max_char (char a,char b){return a>b?a:b;} int main(int argc, char const *argv[]) { printf("int max value =%d \n",max_int(10000,300000)); printf("short max value =%d \n",max_short(100,300)); printf("char max value =%c \n",max_char('a','b')); return 0; }
5. 宏定義和do…while()的結(jié)合
使用場合:如果在宏定義階段,有多條語句,最后將c語句用do…while()包裹起來
#include <stdio.h> #include <string.h> #include <stdlib.h> #define PRINT() printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);\ printf("%s:%s:%d\n",__FILE__,__func__,__LINE__); #define DBUG() do{printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);\ printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);}while(0) int main(int argc, const char *argv[]) { int a=100,b=200; #if 0 /* 調(diào)試宏: __FILE__:文件名 __func__:函數(shù)名 __LINE__:當(dāng)前行號 */ // if(a>b){ // printf("%s:%s:%d\n",__FILE__,__func__,__LINE__); // printf("%s:%s:%d\n",__FILE__,__func__,__LINE__); // }else{ // printf("%s:%s:%d\n",__FILE__,__func__,__LINE__); // printf("%s:%s:%d\n",__FILE__,__func__,__LINE__); // } if(a>b){ PRINT() }else{ PRINT() } #endif #if 0 //如果if或者else只有一條語句,可以省略{} //包括while,for循環(huán)語句都一樣 if(a>b) PRINT() else PRINT() // if和else宏替換后,變成兩句,替換后語法錯誤,解決辦法就是使用宏定義和do....while結(jié)合 #endif // if和else宏替換后,變成兩句,替換后語法錯誤,解決辦法就是使用宏定義和do....while結(jié)合 if(a>b) DBUG(); else DBUG(); return 0; }
6. #ifdef…#else…#endif
格式:
#define 宏定義的名字
#ifdef 宏定義的名字
? //如果宏定義被定義了,這段代碼有效
#else
? //如果宏定義沒被定義,這段代碼有效
#endif
7. #ifndef…#else…#endif
格式:
#define 宏定義的名字
#ifndef 宏定義的名字
? //如果宏定義沒被定義了,這段代碼有效
#else
? //如果宏定義被定義,這段代碼有效
#endif
8. #if defined() … #else … #endif
----> 底層代碼使用較多
格式: #if defined(宏定義的名字) // 如果宏定義被定義了,則這段代碼有效 #else // 如果宏定義沒有被定義,則這段代碼有效 #endif #if !defined(宏定義的名字) // 如果宏定義沒有被定義,則這段代碼有效 #else // 如果宏定義被定義了,則這段代碼有效 #endif // #if defined可以進行邏輯運算 #if defined(宏定義的名字1) || defined(宏定義的名字2) // 以上兩個宏定義只要有一個定義了,則這段代碼有效 #else // 以上兩個宏定義都沒有定義,則這段代碼有效 #endif #if defined(宏定義的名字1) && defined(宏定義的名字2) // 以上兩個宏定義都被定義了,則這段代碼有效 #else // 以上兩個宏定義只要有一個沒有定義,則這段代碼有效 #endif
到此這篇關(guān)于C語言宏定義的擴展定義講解的文章就介紹到這了,更多相關(guān)C語言宏定義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
有關(guān)C++繼承與友元、繼承與類型轉(zhuǎn)換詳解
下面小編就為大家?guī)硪黄嘘P(guān)C++繼承與友元、繼承與類型轉(zhuǎn)換詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01C語言 超詳細(xì)介紹與實現(xiàn)線性表中的帶頭雙向循環(huán)鏈表
帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實現(xiàn)反而簡單2022-03-03