1. 程式人生 > >【c語言】巨集(#define、#和##)與函式比較

【c語言】巨集(#define、#和##)與函式比較

#define

-定義識別符號 ef:#define在預處理階段替代所有的Max

#define Max 100
int main()
{
    printf("%d\n", Max);
    system("pause");
    return 0;
}

define定義識別符號的時候,不要輕易在最後加: eg:

#define Max 100;

int main()
{
    int max = 0;
    if (1)
    {
        max = Max;
    }
    else
        max = -1;
    system("pause");
    return
0; }
  • #define定義巨集 #defien 機制包括一個規定,允許把引數替換到文字中,這個實現通常成為巨集。 下面是巨集的申明方式: #define name( a ) stuff 其中a是一個由逗號隔開的符號表,它們可能出現在stuff中 注意 引數列表的左括號必須與name緊鄰 eg:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define MAX(X,Y)  X>Y?X:Y
int  main()
{
    int
a = 10; int b = 20; int max = MAX(a, b); printf("%d", max); system("pause"); return 0; }

下面程式碼想輸出64卻不行思考解決方法

#define MAX(X,Y)  X>Y?X:Y
#define S(x) x*x
int  main()
{
    int a = 10;
    int b = 20;
    int max = S(3+5);
    printf("%d", max);
    system("pause");
    return 0
; }

解決方法:在巨集定義的兩邊加上一對括號,如下

#define MAX(X,Y)  X>Y?X:Y
#define S(x) (x)*(x)
int  main()
{
    int a = 10;
    int b = 20;
    int max = S(3+5);
    printf("%d", max);
    system("pause");
    return 0;
}

所以用於對數值表示式進行求值的巨集定義都應該用這種方式加上括號,避免在使用巨集時由於引數中的操作符或臨近操作符之間不可預料的相互作用;

  • define的替代 1.在呼叫巨集時,首先對引數進行檢查,看看是否包含任何由#define定義的符號,如果是,它們首先被替代 2.替代文字隨後被插入到程式中原本文字的位置,對於巨集,引數名被它們的值替代。 3.最後,再次對結果檔案進行掃描,看看它是否包含任何由#define定義的服符號,如果是,就重複上述的處理過程

注意 - 巨集引數和#define定義中可以出現#define定義的變數,但是對於巨集,不能出現遞迴 - 當預處理搜尋#define定義的符號的時候,字串常量的內容並不被搜尋

#和##

1.使用#可以把一個巨集引數變為一個對應的字串 eg:

#define Print(val,format)  printf("the value of "#val" is "format, val)
int main()
{
    int a = 9;
    Print(a, "%d");
    system("pause");
    return 0;
}

執行結果為: 這裡寫圖片描述 2.##可以把位於它兩邊的符號合併為一個符號,它允許巨集定義從分離的文字片段建立識別符號 eg:

#define Cat(x,y) x##y
int main()
{
    int test38 = 10;
    printf("%d\n", Cat(test, 38));
    system("pause");
    return 0;
}

輸出結果為10;

巨集和函式

有時候巨集和函式可以完成相同的功能

  • 巨集 優點 1.巨集比函式在程式的規模和速度方面更勝一籌 2.巨集是型別無關的,可以適用於整形,長整形,浮點型等等型別。 劣處 1.每次使用巨集的時候,一份巨集定義的程式碼將插入到程式中,除非巨集比較短,否則可能大幅度增加程式的長度 2.巨集是沒法除錯的 3.巨集型別無關,也不夠嚴謹 4.巨集可能會帶來運算子優先順序的問題,導致程式容易出錯
  • 函式
  • 優處 1.函式程式碼 出現於一個地方,每次使用這個函式,都呼叫用一塊程式程式碼 2.函式引數只在函式呼叫時求值一次,它的結果值傳遞給函式,表示式的求值結果更容易猜測 3.引數在函式被呼叫前只求值一次,在函式中的副作用並不會造成任何特殊的問題 劣處 1.存在函式呼叫返回的額外開銷 2.函式的引數是與型別無關的,如果引數的型別不同,就需要使用不同的函式,即使它們執行的任務是相同的 總結如下 這裡寫圖片描述