預處理-02-檔案包含、條件編譯、小結
1.檔案包含
儘管我們很熟悉,但對檔案包含命令還要說明以下幾點:
1. 一個include命令只能指定一個被包含檔案,若有多個檔案要包含,則需用多個include命令。
2. 檔案包含允許巢狀,即在一個被包含的檔案中又可以包含另一個檔案。
3. 包含命令中的檔名可以用雙引號括起來,也可以用尖括號括起來。例如以下寫法都是允許的:
#include"stdio.h"
#include<math.h>
但是這兩種形式是有區別的:使用尖括號表示在包含檔案目錄中去查詢(包含目錄是由使用者在設定環境時設定的),而不在原始檔目錄去查詢;
使用雙引號則表示首先在當前的原始檔目錄中查詢,若未找到才到包含目錄中去查詢。使用者程式設計時可根據自己檔案所在的目錄來選擇某一種命令形式。
2.條件編譯
預處理程式提供了條件編譯的功能。可以按不同的條件去編譯不同的程式部分,因而產生不同的目的碼檔案。這對於程式的移植和除錯是很有用的。
條件編譯有三種潛規則,下面分別介紹:
第一種形式:它的功能是,如果識別符號已被 #define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。
#ifdef 識別符號 程式段1 #else 程式段2 #endif
如果沒有程式段2(它為空),本格式中的#else可以沒有,即可以寫為:
#ifdef 識別符號 程式段 #endif
第二種形式:
#ifndef 識別符號 程式段1#else 程式段2 #endif
舉例:
#include <stdio.h> void main() { char str[40]; int cmp( char *str1, char *str2 ); printf("Please enter the website you like the best : "); scanf("%s", str); #ifndef CORRECT #define CORRECT "fishc.com" #endif if( cmp( str, CORRECT ) == 0View Code) { printf("\nYeah! You are a smart man!\n\n"); } else { printf("\nYou fool! Man!!\n\n"); } } int cmp( char *str1, char *str2 ) { int i = 0, j = 0; while( str1[i] ) { while( str2[j] == str1[i] ) { i++; j++; if( !str2[j] ) { return 0; } } j = 0; i++; } return -1; }
第三種形式:
#if 常量表達式 程式段1 #else 程式段2 #endif
舉例:
#include <stdio.h> #define ROUND 0 #define PI 3.1415926 void main() { int r; double s; printf("input a number: "); scanf("%d", &r); #if ROUND s = r * r * PI; printf("Area of round is: %6.5f\n\n", s); #else s = r * r; printf("Area of square is: %6.5f\n\n",s); #endif }View Code
3.小結
1. 預處理功能是C語言特有的功能,它是在對源程式正式編譯前由預處理程式完成的。程式設計師在程式中用預處理命令來呼叫這些功能。
2. 巨集定義是用一個識別符號來表示一個字串,這個字串可以是常量、變數或表示式。在巨集呼叫中將用該字串代換巨集名。
3. 巨集定義可以帶有引數,巨集呼叫時是以實參代換形參。而不是“值傳送”。
4. 為了避免巨集代換時發生錯誤,巨集定義中的字串應加括號,字串中出現的形式引數兩邊也應加括號。
5. 檔案包含是預處理的一個重要功能,它可用來把多個原始檔連線成一個原始檔進行編譯,結果將生成一個目標檔案。
6. 條件編譯允許只編譯源程式中滿足條件的程式段,使生成的目標程式較短,從而減少了記憶體的開銷並提高了程式的效率。
7. 使用預處理功能便於程式的修改、閱讀、移植和除錯,也便於實現模組化程式設計。