程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> C語言之預處理命令

C語言之預處理命令

編輯:C語言入門知識

1.前沿

ANSI C標准規定可以在C源程序中加入一些“預處理命令”,以改進程序設計環境,提高編程效率。這些預處理命令不是C語言本身的組成部分,不能直接對它們進行編譯。先要對程序中的這些特殊的命令進行“預處理”,經過預處理後的程序不在包括預處理命令了,最後再由編譯程序對預處理後的源程序進行通常的編譯處理,得到可供執行的目標代碼。
C提供的預處理功能主要有以下3種: 1.宏定義 2.文件包含 3.條件編譯 分別用宏定義命令、文件包含命令、條件編譯命令來實現,這些命令以“#”開頭。

2.宏定義

2.1不帶參數的宏定義

用一個指定的標識符來代表一個字符串,一般形式: #define 標識符 字符串 例子:
#define PI 3.14

說明:

他的作用是在本程序文件中用指定的標識符PI來代替“3.1415926”這個字符串。在預處理時,將程序中在該命令出現後的所有的PI都用“3.1415926”;我們把這些標識符稱為“宏名”。一般的,宏名習慣用大寫表示,以便與變量名相區別。其次,宏定義是在預編譯時不作正確性檢查。最後,宏定義不是C語句,不必在行末在分號,如果添加了則會連分號一起進行置換,極易出錯。

例子:

#define  PI 3.14;
     ...
area = 3.14*r*r;

宏展開,語句為
area = 3.14;*r*r;//語法錯誤

2.2帶參數的宏定義

帶參數的宏定義不是進行簡單的字符串替換,還要進行參數替換,一般形式: #define 宏名(參數表) 字符串 例子:
//定義矩形面積S,a和b是變長
#define S(a,b) a*b
    ...
area = S(3,2);
展開過程: 在程序中如果帶有實參的宏(如S(3,2))則按#define命令行中指定的字符串從左到右進行置換。如果串中包含形參(形如a、b),則將相應的實參代替形參。如果字符串中的字符不是參數字符(形如*)則保留。替換過程如下圖
\

因此賦值語句展開為
area = 3*2;
例子:

#define PI 3.14
#define S(r) PI*(r)*(r)

int _tmain(int argc, _TCHAR* argv[])
{
	float a, area;
	a = 2;
	area = S(a+1);//展開3.14*(a+1)*(a+1)
	printf("r=%.2f,area=%.2f\n",a,area);
}

運行結果:
r=2.0,area=28.26
注意:在宏名與帶參數的括號之間不應加空格,否則會變成不帶參數的宏定義,容易出錯; 例子:
#define S (r) 3.14*(r)*(r)
        。。。
area = S(a+1);//展開3.14*(r)*(r)(a+1)


3.文件包含

所謂的“文件包含”是指一個源文件可以將另外一個源文件的內容全部包含到本文件中,c語言提供#include命令用來實現文件包含,一般形式:
#include<文件名> (一般是庫文件) #include”文件名“ (用戶自定義文件)
下圖形象的展示了文件包含
\

4.條件編譯

一般情況下,源程序中所有的行都要參加編譯,但有時候只希望在滿足一定條件下才進行編譯,這就是“條件編譯”。可以在滿足某條件時編譯一組語句,而當不滿足條件時編譯另外一組語句。 條件編譯的幾種形式:

(1)如果定義“標識符”則執行“程序段1”

#ifdef 標識符<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICAgs8zQ8rbOMTwvcD4KPHA+ICAgICAjZW5kaWY8L3A+CjxwPsD919M6PC9wPgo8YmxvY2txdW90ZT4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#ifdef COMPUTER_A #define INTEGER_SIZE 16 #endif

(2)如果定義“標識符”執行“程序段1”,否則執行“程序段2”

#ifdef 標識符

程序段1

#else

程序段2

#endif

例子:

#ifdef COMPUTER_A
     #define  INTEGER_SIZE 16
#else
     #define  INTEGER_SIZE 32
#endif

(3)如果沒定義“標識符”則執行“程序段1”

#ifndef 標識符

程序段1

#endif

(4)如果“真”執行 “程序段1”否則執行“ 程序段2”

#if 表達式

程序段1

#else

程序段2

#endif

總結:預編譯功能是C語言特有的,有利於程序的可移植性,增加程序的靈活性
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved