C\C++不经意间留下的知识空白------宏
C/C++中的宏
C/C++中的宏極易被忽視,并且很多時候想不起使用,如果宏使用得當,可以極高的提升代碼復用效率,極大的方便開發,在看面試書的過程中遇到的幾種宏的使用,在這里總結一下
預處理使用
這部分在我的理解中,有點像if else來看一下具體的代碼:
#include<stdio.h> #define DEBUGint main() { #ifdef DEBUGprintf("Hello world\n"); #endifprintf("end\n");return 0; }在代碼中,如果宏定義了DEBUG,類似這樣#define DEBUG,Hello world將會輸出,如果沒有定義,則不會輸出。
宏與三元運算符
三元運算符,通常也容易被忽略,使用三元運算符可以進行一些簡單的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; }宏使用中容易產生bug的地方
宏定義并不會運算,而是在編譯時,將宏定義的代碼在程序中進行替換,具體的看代碼:
#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; }在這段代碼中,如果略作修改,結果就會大大不同,將宏定義修改為#define SQR(x) (x * x),則在程序的運行中,利用宏定義替換即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,顯然這并是我們需要的結果,對于代碼中的寫法,SQR(b+2)=((b+2)?(b+2))=25SQR(b+2) = ((b+2)*(b+2)) =25SQR(b+2)=((b+2)?(b+2))=25.所以在使用宏定義時,要記住是替換,替換,替換。
宏參數的連接
宏參數的連接在看這個之前我是一臉懵逼,什么是宏參數的連接完全不知道,就像撿了黃金的傻子一樣很興奮的看了一下,果然厲害。簡單來說:分為兩種,一種是#(參數)將參數轉換為字符串,另一種是##((參數1)##(參數2))將兩個參數拼接為參數1參數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; }最后輸出的結果為abcd 23
看到這里不知你有沒有一個大膽的想法,對于字符串的連接還需要什么strcat等等之類的API,看我宏定義大發神威:
宏與位運算的配合
對于做硬件開發的來說,會經常遇到取高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語言沒有類似python中使用len直接得到數組長度而沮喪,宏的出現,讓我們看到了曙光,今天就用宏來實現求數組長度。
#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; }總結
以上是生活随笔為你收集整理的C\C++不经意间留下的知识空白------宏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果网页归档转html,常用JS转换HT
- 下一篇: 小学毕业java_Java运算符