【C】函數與宏分析

函數與宏

宏是由預處理器直接替換展開的,編譯器不知道宏的存在
函數是由編譯器直接編譯的實體,調用行爲由編譯器決定
屢次使用宏會致使最終可執行程序的體積增大
函數是跳轉執行的,內存中只有一份函數體存在
宏的效率比函數要高,由於是直接展開,無調用開銷
函數調用時會建立活動記錄,效率不如宏

例子46-1:函數

#include "stdio.h"
#define RESET(p, len) \
    while(len > 0 )  \
    (char*p)[--len] = 0
void reset(void*p, int len)
{
    while(len > 0)
        ((char*)p)[--len] = 0;
}
int main()
{
    int array_1[]  ={1,2,3,4,5};
    int len = sizeof(array_1);
    int i = 0;
    reset(array_1,len);
    for(i = 0;i < 5;i ++)
    {
        printf("array[%d] = %d\n",i ,array_1[i]);
    }
    return 0 ;
}

輸出結果:code

array[0] = 0
array[1] = 0
array[2] = 0
array[3] = 0
array[4] = 0
宏的效率比函數稍高,可是反作用巨大
宏是文本替換,參數沒法進行類型檢查
能夠用函數完成的工程絕對不用宏
宏的定義中不能出現遞歸定義

例子46-2:遞歸

#include "stdio.h"
#define ADD(a,b) a+b
#define MUL(a,b) a*b
#define MIN(a,b) ((a)<(b)?(a):(b))
int main()
{
    int i = 1;
    int j = 10;
    printf("%d\n",MUL(ADD(1,2),ADD(3,4)));    //直接文本替換 1+2*3+4 = 11
    printf("%d\n",MIN(i++,j));
    return 0;
}
輸出結果:
11
2

宏的妙用

用於生成一些常規性的代碼
封裝函數,加上類型信息

小結:

宏和函數不是競爭對手
宏可以接受任何類型的參數,效率高,易出錯
函數的參數必須是固定類型,效率稍低,不易出錯
宏能夠實現函數不能實現的功能
相關文章
相關標籤/搜索