<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用c中的#define 來定義一個常數來表示一年有多少秒
#define SECONDS_PER_YEAR (606024*365)UL
求圓的周長:
#define D® (r + r) //使用D(5) * 3.14 -----> (5 + 5) * 3.14
在定義宏函數時,最後一個表示式的結果就是宏函數的返回值
格式:
#define 宏函數名(形參表) ({語句1;語句2;語句3…})
形參沒有資料型別,只有引數名
請寫一個「標準」的宏MIN,這個宏輸入兩個引數並返回較大較小值 #include <stdio.h> #define MIN(A,B) ({A<B?A:B;}) //宏定義分成多行書寫,行尾必須加續行符 #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=%dn",min); int max=MAX(100,200); printf("max value=%dn",max); return 0; }
#可以將宏的引數轉換為一個字串
#include <stdio.h> #define NAME "lisi" #define NAME1(n) n #define NAME2(n) #n int main(int argc, char const *argv[]) { printf("%sn",NAME); //------>printf("%sn","lisi"); printf("%sn",NAME1(lisi)); //------>printf("%sn",lisi); //error printf("%sn",NAME2(lisi)); //------>printf("%sn","lisi"); //error return 0; }
預處理之後的效果:
# 5 "test02.c" int main(int argc, char const *argv[]) { printf("%sn","lisi"); printf("%sn",lisi); printf("%sn","lisi"); return 0; }
兩個#可以實現字串的拼接
// 將a和b代表的字串拼接生成一個新的字串
#define type(a, b) a##btype(uint, _t) ----> 預處理階段展開之後的結果 : uint_t
練習:int型、short型、char型的資料比較大小
#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 //使用宏定義完成函數模板 #define MAX(T) T max_##T (T a,T b){return a>b?a:b;} //使用宏定義,定義max_int max_short max_char函數 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; }
預處理程式碼:
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; }
使用場合:如果在宏定義階段,有多條語句,最後將c語句用do…while()包裹起來
#include <stdio.h> #include <string.h> #include <stdlib.h> #define PRINT() printf("%s:%s:%dn",__FILE__,__func__,__LINE__); printf("%s:%s:%dn",__FILE__,__func__,__LINE__); #define DBUG() do{printf("%s:%s:%dn",__FILE__,__func__,__LINE__); printf("%s:%s:%dn",__FILE__,__func__,__LINE__);}while(0) int main(int argc, const char *argv[]) { int a=100,b=200; #if 0 /* 偵錯宏: __FILE__:檔名 __func__:函數名 __LINE__:當前行號 */ // if(a>b){ // printf("%s:%s:%dn",__FILE__,__func__,__LINE__); // printf("%s:%s:%dn",__FILE__,__func__,__LINE__); // }else{ // printf("%s:%s:%dn",__FILE__,__func__,__LINE__); // printf("%s:%s:%dn",__FILE__,__func__,__LINE__); // } if(a>b){ PRINT() }else{ PRINT() } #endif #if 0 //如果if或者else只有一條語句,可以省略{} //包括while,for迴圈語句都一樣 if(a>b) PRINT() else PRINT() // if和else宏替換後,變成兩句,替換後語法錯誤,解決辦法就是使用宏定義和do....while結合 #endif // if和else宏替換後,變成兩句,替換後語法錯誤,解決辦法就是使用宏定義和do....while結合 if(a>b) DBUG(); else DBUG(); return 0; }
格式:
#define 宏定義的名字
#ifdef 宏定義的名字
//如果宏定義被定義了,這段程式碼有效
#else
//如果宏定義沒被定義,這段程式碼有效
#endif
格式:
#define 宏定義的名字
#ifndef 宏定義的名字
//如果宏定義沒被定義了,這段程式碼有效
#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
到此這篇關於C語言宏定義的擴充套件定義講解的文章就介紹到這了,更多相關C語言宏定義內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45