日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言#define定義宏的使用詳解_C 語言

作者:小小涵兒 ? 更新時間: 2022-12-02 編程語言

1.宏是什么

#define 機制包括了一個規定,允許把參數替換到文本中,這種實現通常稱為宏(macro)或定義宏(define macro)。

語法:

#define name( parament-list ) stuff

parament-list:是一個由逗號隔開的符號表。

2.宏的用法

#define SUM(x,y) ((x)+(y))
int main()
{
    int a = 10;
    int b = 20;
    int ret = SUM(a, b);
    printf("%d\n", ret);
    return 0;
}

簡要說明:宏已經被替換

分位三個階段:預編譯、編譯、匯編

3. 宏的注意事項

定義什么替換什么

來看這一例:

#define NUM(x,y) x+y
int main()
{
    int a = 2;
    int b = 3;
    printf("%d\n", NUM(a, b) * NUM(a, b));
    //結果:11
    return 0;
}

原因:num(a,b)*num(a,b) = a + b * a + b=11

4. 宏和函數的區別

屬性 #define定義宏 函數
代碼長度 如果多次調用,多次替換,如果是大長度宏其長度很長 函數只實現一次可以多次使用,如果多次調用,長度只有一份
執行速度 更快 函數調用和開辟都會有額外開銷
操作符優先級 必須每個參數加上括號,否則操作符優先級可能會產生不可預料的后果 函數參數只在函數調用的時候求值一次,它的結果值傳遞給函數。表達式的求值結果更容易預測
帶有副作用參數 多次調用宏會有不可預料的后果 函數參數只在傳參的時候求值一次,結果更容易控制,只需關注是傳值還是傳址
參數類型 宏的參數和類型無關,可以使用與任何參數類型 函數參數與類型有關,類型取決于使用目的,傳值,傳址,還是拿一個字節數據char*
調試 不方便調試,編譯期間就已經替換 可調試
遞歸 不可遞歸 可遞歸

宏帶副作用參數:

#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
int main()
{
    int x = 5;
    int y = 8;
    int z = MAX(x++, y++);
    printf("x=%d y=%d z=%d\n", x, y, z);//輸出的結果是什么
    return 0;
}
//( (x++) > (y++) ? (x++):(y++) )
//輸出結果:x=6,y=10,z=9

5.命名要求

宏名必須大寫

函數不要全部大寫

6. 條件編譯

常見條件編譯指令及應用場景

1.單分支

編譯指令:

#if 常量表達式
? //…
#endif

應用場景:

int main()
{
#if 4>2
    printf("hello world!\n");
#endif
    return 0;
}
//輸出hello world

2.多分支

編譯指令:

#if 常量表達式
? //…
#elif 常量表達式
? //…
#else
? //…
#endif

應用場景:

int main()
{
#if 1>2
    printf("xixi\n");
#elif 4>3
    printf("haha\n");
#else 
    printf("heihei\n");
#endif
    return 0;
}
//輸出結果:haha

可不能和if else選擇語句混淆,多分支條件編譯從上往下走,如果有一個分支成立,后面分支就不再執行;但是選擇語句是從上往下走,有一個分支成立,繼續查看后面分支是否成立

3.判斷是否被定義

編譯指令:

1. > #if defined(symbol) 或 #ifdef symbol

2. > #if !defined(symbol) 或 #ifndef symbol

應用場景:

  ```c
  
  #define DEF    
  int main()
  {
  #if defined(DEF)
      printf("haha\n");
  #endif
  
  #ifdef MAX
      printf("heihei\n");
  #endif
      return 0;
  }
  //輸出結果:haha
  ```

4.嵌套指令

編譯指令

#if 常量表達式
#ifdef symbol
//操作
#endif
#elif 常量表達式
#ifdef symbol
//操作
#endif
#endif

條件編譯指令也支持嵌套,注意#endif結束本次嵌套

5.刪除宏定義

編譯指令:

#undef

應用場景:

#define DEF
int main()
{
#undef DEF//刪除DEF宏定義了
#ifdef DEF
    printf("hehe\n");
#endif
    return 0;
} 

原文鏈接:https://blog.csdn.net/m0_46343224/article/details/127512412

欄目分類
最近更新