C\C++不经意间留下的知识空白------宏
C/C++中的宏
C/C++中的宏極易被忽視,并且很多時(shí)候想不起使用,如果宏使用得當(dāng),可以極高的提升代碼復(fù)用效率,極大的方便開發(fā),在看面試書的過程中遇到的幾種宏的使用,在這里總結(jié)一下
預(yù)處理使用
這部分在我的理解中,有點(diǎn)像if else來看一下具體的代碼:
#include<stdio.h> #define DEBUGint main() { #ifdef DEBUGprintf("Hello world\n"); #endifprintf("end\n");return 0; }在代碼中,如果宏定義了DEBUG,類似這樣#define DEBUG,Hello world將會(huì)輸出,如果沒有定義,則不會(huì)輸出。
宏與三元運(yùn)算符
三元運(yùn)算符,通常也容易被忽略,使用三元運(yùn)算符可以進(jìn)行一些簡(jiǎn)單的if else 判斷。
#include <stdio.h>#define Max(a,b) ((a) > (b))? (a):(b) #define Min(a,b) ((a) > (b))? (b):(a)int main() {int x = 23,y = 76;printf("max in x,y:%d\n",Max(x,y));printf("min in x,y:%d\n",Min(x,y));return 0; }宏使用中容易產(chǎn)生bug的地方
宏定義并不會(huì)運(yùn)算,而是在編譯時(shí),將宏定義的代碼在程序中進(jìn)行替換,具體的看代碼:
#include <stdio.h>#define SQR(x) ((x)*(x))int main() {int a,b = 3;a = SQR(b+2);printf("a = %d\n",a);return 0; }在這段代碼中,如果略作修改,結(jié)果就會(huì)大大不同,將宏定義修改為#define SQR(x) (x * x),則在程序的運(yùn)行中,利用宏定義替換即SQR(b+2)=(b+2?b+2)=(3+2?3+2)=11SQR(b+2)=(b+2*b+2) = (3+2*3+2)=11SQR(b+2)=(b+2?b+2)=(3+2?3+2)=11,顯然這并是我們需要的結(jié)果,對(duì)于代碼中的寫法,SQR(b+2)=((b+2)?(b+2))=25SQR(b+2) = ((b+2)*(b+2)) =25SQR(b+2)=((b+2)?(b+2))=25.所以在使用宏定義時(shí),要記住是替換,替換,替換。
宏參數(shù)的連接
宏參數(shù)的連接在看這個(gè)之前我是一臉懵逼,什么是宏參數(shù)的連接完全不知道,就像撿了黃金的傻子一樣很興奮的看了一下,果然厲害。簡(jiǎn)單來說:分為兩種,一種是#(參數(shù))將參數(shù)轉(zhuǎn)換為字符串,另一種是##((參數(shù)1)##(參數(shù)2))將兩個(gè)參數(shù)拼接為參數(shù)1參數(shù)2的形式。具體的在代碼中感悟吧!
#include <stdio.h>#define STR(a) #a #define CONS(a,b) int(a##b) int main(void) {printf(STR(abcd));printf("\n");printf("%d\n",CONS(2,3));return 0; }最后輸出的結(jié)果為abcd 23
看到這里不知你有沒有一個(gè)大膽的想法,對(duì)于字符串的連接還需要什么strcat等等之類的API,看我宏定義大發(fā)神威:
宏與位運(yùn)算的配合
對(duì)于做硬件開發(fā)的來說,會(huì)經(jīng)常遇到取高8位,或者第8位等,今天讓宏來拯救:
#include<stdio.h>#define WORLD_LO(xxx) ((int) ((xxx) & 255)) #define WORLD_HI(xxx) ((int) ((xxx) >> 8))int main() {int a = 0xeeff;printf("%x\n",WORLD_LO(a)); printf("%x\n",WORLD_HI(a));return 0; }用宏測(cè)量數(shù)組長(zhǎng)度
是否還在為C語(yǔ)言沒有類似python中使用len直接得到數(shù)組長(zhǎng)度而沮喪,宏的出現(xiàn),讓我們看到了曙光,今天就用宏來實(shí)現(xiàn)求數(shù)組長(zhǎng)度。
#include <stdio.h>#define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))int main() {int a[150];printf("the array a is :%d\n",ARR_SIZE(a));return 0; }總結(jié)
以上是生活随笔為你收集整理的C\C++不经意间留下的知识空白------宏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果网页归档转html,常用JS转换HT
- 下一篇: 链表反转相关的题(C++模板)