對(duì)于編譯預(yù)處理我還不太理解他的具體用處,反正在編寫時(shí)需要寫在開頭。我比較常用的三個(gè):#include <stdio.h>,#include <stdlib.h>,#include <string.h>。
下面還是需要把一些知識(shí)點(diǎn)整理一下,便于以后的回顧和總結(jié),
- C預(yù)處理器在程序執(zhí)行之前查看程序,根據(jù)程序中的預(yù)處理指令,預(yù)處理器把符號(hào)縮寫替換成其表示的內(nèi)容。
在該階段,編譯器將上述代碼中的stdio.h編譯進(jìn)來,并且用戶可以使用Gcc的選項(xiàng)"-E"進(jìn)行查看,該選項(xiàng)的作用是讓gcc在預(yù)處理結(jié)束后停止編譯過程。
具體包括以下過程:
1、將所有的#define刪除,并且展開所有的宏定義;
2、處理所有的條件預(yù)編譯指令,比如#if #ifdef #elif #else #endif等;
3、處理#include 預(yù)編譯指令,將被包含的文件插入到該預(yù)編譯指令的位置。
4、刪除所有注釋 “//”和”/* */”.
5、添加行號(hào)和文件標(biāo)識(shí),以便編譯時(shí)產(chǎn)生調(diào)試用的行號(hào)及編譯錯(cuò)誤警告行號(hào)。
在預(yù)處理之前,編譯器必須對(duì)該程序進(jìn)行一些翻譯
1.編譯器把源代碼中出現(xiàn)的字符映射到源字符集。
2.編譯器定位每個(gè)反斜杠后面跟著的換行符并且刪除他們。
3.編譯器把文本分成預(yù)處理記號(hào)序列、空白序列和注釋序列
#define
- /#define 預(yù)處理執(zhí)行和其他預(yù)處理指令一樣,以#開始。它2可以出現(xiàn)在程序的任何位置,其定義從指令出現(xiàn)的地方到該文件末尾有效。
我感覺這個(gè)用的比較多的就是定義符號(hào)常量。例如#define PI 3.14159. - 每行#define都由三部分組成
/#define PX printf("x is %d.\n",x);
預(yù)處理指令 宏 替換體
宏和函數(shù)的選擇
宏和函數(shù)的選擇實(shí)際上是時(shí)間和空間上的權(quán)衡。宏在編譯的時(shí)候在程序中生成語句,如果調(diào)用20次宏即在程序中插入20行代碼。如果調(diào)用20次函數(shù),程序中只有一份函數(shù)的語句的副本,所以節(jié)省了空間。然而另一方面,程序的控制必須跳轉(zhuǎn)到函數(shù)內(nèi),然后再返回主調(diào)程序中,這比直接在程序中生成代碼浪費(fèi)更多的時(shí)間。
簡單來說宏比函數(shù)浪費(fèi)空間,函數(shù)比宏浪費(fèi)時(shí)間。
頭文件包含:#include
- / #include 指令有兩種形式:(尖括號(hào)和引號(hào))
/ #include <stdio.h> <--查找系統(tǒng)目錄
/ #include "hot.h" <--查找當(dāng)前目錄
引號(hào)還是不錯(cuò)的可以將一個(gè)文件一分為三,便于查錯(cuò)。
例如:一個(gè)phone.c的文件,分為phone.h;menu.c;main.c。 - phone.h:
#ifndef _MUNU_H_
#define _MUNU_H_
結(jié)構(gòu)體
頭文件
#endif
- menu.c
#include "phone.h"
函數(shù)的主體文件,main函數(shù)和結(jié)構(gòu)體除外。
- main.c
#include "phone.h"
main函數(shù)
···