C語言中define的用法

1 .最簡單且最常見的define用法

#define N 100

編譯器在預處理程序時,會將程序中所有的N用100來替換,換言之,不同於const常量,define其實本質上對文本內容的替換。

下面是define和const的區別:

  1. define是宏定義,程序在預處理階段將用define定義的內容進行了 替換 。因此在程序運行時,常量表中並沒有用define定義的常量,系統不爲它分配內存。
    而const定義的常量,在程序運行時,存在常量表中,且系統爲它分配內存。
  2. define定義的常量,預處理時只是直接進行了替換,因此在編譯時不能進行數據類型檢驗。
    而const定義的常量,在編譯時進行嚴格的類型檢驗,可以避免出錯。
  3. define定義表達式時要注意“邊緣效應”
    例如:
#define N 1+2 
float a = N/2.0;
/*
按照常規做法,可能會認爲結果是3/2 = 1.5
但是實際上,結果應該爲1+2/2.0 = 2.0

若想要實現3/2,則#define N (1+2)
即爲避免邊緣效應,一定要加!括!號!
*/

2 .用define定義函數
舉個例子:

#include<stdio.h>
#define PI 3.14
#define S(r) PI*r*r
int main(void)
{
    printf("area = %f", S(1+2));
    rerturn 0;
}

結果:
3.14*1+2*1+2 = 3.14+2+2 = 7.14

重要的事情再說一遍:宏其實就是一個簡單的文本替換!

3 .不常用的define用法

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示x連接y
- 比如: int n = Conn(123,456);
- 結果: n=123456;
- char* str = Conn(“asdf”, “adf”);
- 結果: str = “asdfadf”;

而#@x,其實就是給x加上單引號,結果返回一個const char。
- 比如:char a = ToChar(1);
- 結果:a=’1’;

做個越界試驗 char a = ToChar(123);結果是a=’3’; 但是如果參數超過四個字符,編譯器就會報錯!

至於#x,就是給x加上雙引號

  • 比如:char* str = ToString(123132);
  • 結果:str=”123132”;

4 .定義宏和取消宏
定義宏使用#define
取消宏定義使用#undef

發佈了31 篇原創文章 · 獲贊 222 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章