c/c++宏函数的定义与使用(宏定义函数)(macro definition)
文章目錄
- 為什么要使用宏函數?
- 什么是宏
- 如何使用宏
- 宏的定義
- 不帶參數的宏
- 帶參數的宏(假參數,不是真正的參數,只是替換而已)
- 原理
- 對了,如果宏函數與函數名稱相同,優先使用宏定義函數
為什么要使用宏函數?
在C程序中,可以用宏代碼提高執行效率。宏代碼本身不是函數,但使用起來象函數。
預處理器用復制宏代碼的方式代替函數調用,省去了參數壓棧、生成匯編語言的CALL調用、
返回參數、執行return等過程,從而提高了速度。 (避免函數調用,提高程序效率)
使用宏代碼最大的缺點是容易出錯,預處理器在復制宏代碼時常常產生意想不到的邊際效應。
參考文章:為什么要用宏定義函數
什么是宏
它是一種預處理器指令,在預編譯階段將宏名替換為后面的替換體 。
如何使用宏
宏的定義
#define WIDTH 960預處理指令 宏名 替換體(多行可用 \ 延續)不帶參數的宏
#include <stdio.h> #include <stdlib.h> #define _width 1024 //宏命名規則同變量名 #define ADDR "中華人民共和國云南\省飛天縣" int main(void){ printf("width: %d\n", _width); printf("我的祖籍: %s\n", ADDR);system("pause"); return 0; }VS上運行結果:
width: 1024 我的祖籍: 中華人民共和國云南 省飛天縣帶參數的宏(假參數,不是真正的參數,只是替換而已)
#include <stdio.h> #include <stdlib.h> #define SQUARE(x) x*x int main(void) {int i = 10;int j = SQUARE(i); // 宏展開 j = i*i;int k = SQUARE(8 + 2); // 宏展開 8+2*8+2printf("j: %d\n", j);printf("k: %d\n", k);system("pause");return 0; }運行結果:
j: 100 k: 26毋庸置疑,j = 100;但 k = 26,為啥?
宏只是一個替換,不會自動加括號,非常死板!
解決方法:
#define SQUARE(x) ((x)*(x)) #include <stdio.h> #include <stdlib.h> #define SQUARE(x) ((x)*(x)) int main(void) {int i = 10;int j = SQUARE(i); // 宏展開 j = i*i;int k = SQUARE(8 + 2); // 宏展開 8+2*8+2printf("j: %d\n", j);printf("k: %d\n", k);system("pause");return 0; }運行結果:
j: 100 k: 100原理
這里可以知道,使用宏比調用函數更加高效。因為,使用宏就像使用頭文件一樣,就比如使用<string.h>,使用頭文件<string.h>進行預編譯之后,直接可以使用字符串進行定義使用;宏也是如此,在定義宏之后,編譯器直接進行了預編譯,這時候調用它,就是直接進行替換。
而調用其他函數時,要給他在內存中單獨分配空間,普通變量分布在棧區,動態內存分布在堆區,靜態變量在全局數據區(全局數據區也包括全局變量),字符常量在常量區,二進制指令(也就是函數體)分布在代碼區。執行這個函數時,要獲取被調用函數指定的地址(被調用函數的地址有一個范圍,起始地址就是函數的入口地址,被調用函數從起始地址開始一步步往下執行),之后程序會跳轉到被調函數的第一條語句,一步步往下依次執行被調函數中的語句,直到函數執行結束。
參考文章:宏的定義,使用,以及使用宏為什么比調用函數更加高效
對了,如果宏函數與函數名稱相同,優先使用宏定義函數
#include <stdio.h> // div function prototype float div(float, float); #define div(x, y) x / yint main() { // use of macro div // Note: %0.2f for taking two decimal value after point printf("%0.2f", div(10.0, 5.0)); // removing defined macro div #undef div // function div is called as macro definition is removed printf("\n%0.2f", div(10.0, 5.0)); return 0; }// div function definition float div(float x, float y) { return y / x; }編譯運行結果:
2.00 0.50參考文章:C 中關于宏和預處理器的有趣事實
總結
以上是生活随笔為你收集整理的c/c++宏函数的定义与使用(宏定义函数)(macro definition)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 环境变量 export PA
- 下一篇: linux 进程间通信 命名管道FIFO