C/C++ 預處理指令

2019-06-21

整個五月份,完成駕駛員科目三訓練+考試,相當浪費時間,相當於什麼都沒做··

主要的預處理指令:

  • #include

  • #define

  • #undef
  • #if
  • #ifdef
  • #ifndef
  • #elif
  • #endif
  • #error

    預處理指令

  • # 開頭,除空白字符外的第一個字符為此;

  • # 後跟預處理指令;
  • 編譯前,編譯器會對此作出相關的轉換操作;

#include:包含一個源代碼文件

#include<stdio.h> 使用尖括號

搜索頭文件來自:

  • 編譯器自帶的庫;
  • 外部庫中的頭文件;

#include “stdio.h” 使用雙引號

搜索頭文件來自:

  • 源代碼的文件夾中搜索
  • 如果↑找不到,再搜索編譯器自帶的頭文件;

#define:設置常量?

我們以往的印象中是直接用這玩意設置常量,例如:

1
2
#include<stdio.h>
#define PI 3.1415926

這樣的話我們就可以在代碼中使用 PI了。

定義宏的基本使用

宏?沒理解的話雲裡霧裡的抽象東西,知道他是:根據一系列預定義的規則替換一定的文本模式就好。上面我們也是看到了一個宏定義的基礎使用!

有趣的使用方式,也是我看別人博客才知道的···別人博客的鏈接

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#define MAX(x,y) (((x)>(y))?(x):(y))
int main(){

#ifdef MAX //判斷MAX(x,y)是否被定義
printf("3 and 5 the max is:%d\n",MAX(3,5));
#endif
return 0;
}

這樣可以讓變量帶入預留號的 x, y 來使用,但是使用時需要注意運算的優先級,因為需要帶括號,不規範的使用會讓我們得到我們不需要的結果:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#define SQR(x) (x*x)
int main(){
int b=3;
#ifdef SQR
printf("a = %d\n",SQR(b+2));
#endif
return 0;
}

這裡需要把程序的第二行替換成:

1
#define SQR(x) ((x)*(x))

防止傳入 b+2 後,的表達式變成: b+2*b+2 沒有規範好優先級···

宏的參數連接

  • 使用 一個井號 # ,把參數轉化為字符串;
  • 使用 兩個井號 ##,“粘合”參數;
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#define STR(s) #s
#define CONS(x,y) (int)(x##e##y)
int main(){
int a = "2019"
#ifdef STR
printf(STR(a));
#endif
#ifdef CONS
printf("\n%d\n",CONS(1,8));
#endif
return 0;
}

宏的獲得一個字的高位或低位字節

注意,這裡是獲得一個的高位/低位

  • 一個字由兩個字節組成;
  • 1個,高位字節;
  • 1個,低位字節;
1
2
#define WORD_LO(xxx) ((byte)((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte)((word)(xxx) >> 8))

WORD_LO 中

利用 & 的特性:

  • 1&1 = 1;
  • 0&1 = 0;
  • 1&0 = 0;

& 255 相當於 :任何數據和 0000,0000,1111,111 進行 &運算;

WORD_HI 中

>>8 ,所參與的數據二進制向右移動8位,原有的右8位不保留。

用宏定義得到一個數組所含元素的個數

1
#define ARR_SIZE(v) (sizeof((v))/sizeof((v[0])))
  • 數組的總大小 除以 每個類型的大小

#ifdef,#ifndef,#else,#endif

這些宏定義中的判斷實際上和我們日常開發中的 if … else if … else, 都是同理的,注意所有操作需要#endif來結尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#define PI 3.141592

int main(){

#ifdef PI //判斷如果定義了PI
printf("%d",PI);
#else
printf("%d",3.141592);//else 如果沒有定義PI
#endif

#ifndef PI //判斷如果沒有定義PI
printf("%d",3.141592);
#endif

return 0;
}

Comments: