預處理命令

預處理命令

重點:

        午餐宏定義和有參宏定義;

        文件包含;

        條件編譯。

一、宏定義

        C語言標準允許在程序中用一個標識符來表示字符串,稱爲宏。標識符爲宏名,在編譯預處理時,將程序中所有的宏名用相應的字符串來替換,這個過程稱爲宏替換,宏分爲兩種:無參數宏和有參數宏。

            1.無參數宏

                        無參數宏定義一般形式:
                        #define  標識符字符串
                      “#”代表本行是編譯預處理命令。define是宏定義的關鍵詞,標識符是宏名。字符串是宏名所代替的內容,可以是常數、表達式等。
                    例:使用無參數宏的程序,輸入半徑,求圓的周長、面積和體積。
#include "stdafx.h"
#define PI 3.1415926

int _tmain(int argc, _TCHAR* argv[])
{
	float l,s,r,v;
	printf("input radius:");
	scanf("%f",&r);
	l=2.0*PI*r;
	s=PI*r*r;
	v=4.0/3.0*PI*r*r*r;
	printf("l=%10.4f\n s=%10.4f\n v=%10.4f\n",l,s,v);
	getchar();
	return 0;
}
    說明:使用宏代替一個字符串,可以減少程序中重複書寫某些字符串的工作量。如果沒有使用宏,那麼就要查找程序並修改所有的PI值。宏的作用範圍是從宏定義開始到源程序文件結束爲止。

            2.有參數宏

                        有參數的宏類似於有參數的函數,其定義的一般形式:
                         #define 標識符(形參表)字符串
                         如果有多個形參,像函數參數一樣以逗號隔開。在程序中使用有參數宏的形式是:
                        標識符(實參表)
                    例:演示有參宏的實現方法
#include "stdafx.h"
#define MAX(x,y) (x>y?x:y)

int _tmain(int argc, _TCHAR* argv[])
{
	int a=1,b=2,max;
	max=MAX(a,b);
	printf("the max between(%d,%d)is%d\n",a,b,max);
	getchar();
	return 0;
}
    注意:宏名與形參表的圓括號之間不能有空格,否則會導致錯誤。在宏定義中,字符串內的形式參數最好用括號括起來,以避免錯誤。
        總的來說,當語句較簡單時,可考慮使用宏定義,從程序執行的速度來說,它優於函數。使用宏的次數較多時,宏替換後源程序一般會變長。而函數調用不會使程序變長。宏替換不會佔用運行時間,只是編譯的時間稍微長一點。而函數調用則會佔用運行時間。一般用宏定義代表一些較爲簡單的表達式比較適合。

二、文件包含

              文件包含是指把指定源文件的全部內容包括到當前源程序文件中。
              一般形式:#include “文件名”
              文件包含預定處理命令#include的作用是使一個源文件可以將另一個源文件的全部內容包含進來,把指定的文件插入命令行位置取代命令行,從而把指定文件和當前的源程序文件連成一個源程序。

三、條件編譯    

            條件編譯是指在特定的條件下,對滿足條件和不滿足條件的情況分別進行處理——滿足條件時編譯某些語句,不滿足條件時編譯一些語句。
            條件編譯命令有幾種模式:

                模式一:

                #ifndef 標識符
                程序段1
                #endif
                其含義是:如果沒有定義標識符,則編譯程序段1(既可以是語句組,也可以命令行)。
                實例:
                
#ifndef getkey
#define getkey
#include <sys/types.h>
#endif

                模式二:

                #ifndef 標識符
                程序段1
                #else
                程序段2
                #endif
                其含義是:如果沒有定義標識符,就編譯程序段1,否則就編譯程序段2。

                模式三:

                #ifdef 標識符
                程序段1
                #endif
                其含義:如果定義了標識符,就編譯程序段1,否則就不編譯該程序段。
                實例:
                
#ifdef DEBUG
printf{"a=%d,b=%d",a,b};
#endif

                模式四:

                #ifdef 標識符
                程序段1
                #else
                程序段2
                #endif
                其含義是:如果定義了標識符,就編譯程序段1,否則編譯程序段2。

                模式五:

                #if  表達式
                程序段1
                #endif
                其含義是:如果表達式成立,則就編譯程序段1,否則不編譯該程序段。
                實例:
#include<stdio.h>
#define MAX(x,y) (x>y?x:y)
...
int  a=5,b=10,c;
...
#if c
c=MAX(a,b);
#endif

                模式六:

                #if  表達式
                程序段1
                #else
                程序段2
                #endif
                其含義是:如果表達式成立,就編譯程序段1,否則編譯程序段2。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章