C語言邏輯預處理器

在C++中最好是用const來聲名常量,比如const long double PI=3.1416;這樣的話PI將會始終保持為long double類型。語句中的字元序列可以是任意的字元序列,而不僅僅是數字,比如#define PI HYONG這樣的話在使用PI使就會用HYONG來替換掉PI,當然HYONG這裡會是一個未定義的標識符。

簡介

在C++中最好是用const來聲名常量,比如const long double PI=3.1416;這樣的話PI將會始終保持為long double類型。語句中的字元序列可以是任意的字元序列,而不僅僅是數字,比如#define PI HYONG這樣的話在使用PI使就會用HYONG來替換掉PI,當然HYONG這裡會是一個未定義的標識符。

內容分類

1 預處理器:預處理器是編譯器把C++代碼編譯為機器指令之前執行的一個過程,所有的預處理器都是#開頭,以便與C++語句區分開來,#include預處理器指令在前面已經用過不少了

1.1 、#define 指令:該指令用於符號置換,其格式為#define 標識符 字元序列。注意該語句不以分號結束。比如#define PI 3.1416就表示把PI置換為3.1416,這裡要注意的是雖然PI看起來和變數一樣,但PI和變數沒有任何關係,PI只是一個符號或標誌,在程式代碼編譯前該符號會用一組指定的字元來代替。還要注意的是3.1416並不是一個數值,而是一個字元串,因此不會進行類型檢查。

1.2 、從程式串刪除#define 定義的標誌:在#define語句中,如果沒有為標識符指定置換字元串,標識符就會被一個空的字元串來代替,也就是說標識符被刪除了,比如#define PI表示在程式中該語句後面刪除所有的PI標識符。

1.3 、取消#define 的定義:可以使用#undef來取消#define定義的標識符,比如#undef PI表示在#undef後面的語句中標識符PI的定義被取消了。

1.4 、帶參數的#define 其格式為#define 標識符(參數列表) 置換字元串。比如#define f(v) cout<<(v)<<endl;表示將f(v)用後面的字元串替換,其中的參數v也可以進行替換,比如在程式中可以這樣調用f(3);就會把程式轉換為cout<<(3)<<endl;結果程式輸出3,注意這裡的括弧不會被輸出。參數列表也可以有多個參數,參數間用逗號隔開即可,比如#define f(m,n) cout<<(m)<<(n)<<endl;如果有調用f(3,4);程式轉換為cout<<(3)<<(4)<<endl;輸出34。

1.5 、#define 可以引起的錯誤:比如#define f(m,n) m*n 如果有調用f(4+2, 3);則該語句會被轉換為4+2*3這與我們所希望的(4+2)*3不一致,要解決這個問題就是給參數加上符號,比如#define f(m,n) (m)*(n)

1.6 、怎樣把預處理指令放在多行上:其方法為使用”\”續行符符號,該符號應在上一行的最後一個字元。

比如#define m \

kkielfml

1.7 、#define 使用字元串作為參數:比如#define m “kdi”如果有語句cout<<m;則會輸出字元串kdi,但要注意,不能這樣做#define m dki cout<<”m”;不能在標誌符前加上雙引號以試圖輸出字元串dki,這樣只會輸出字元串m,因為程式會把”m”解釋為一個字元串,而不會把它解釋為cout<<”dki”。

3.8、#define把參數指定為字元串:其方法是在參數前加上符號”#”,比如#define f(m) cout<<#m 如果這時有f(dikl);則程式將會轉換為cout<<”dikl”,最後輸出字元串dikl。這裡要注意的是該方法只能用於參數,而不能用於其他地方,比如#define m #kidkl這樣就是錯誤的,這裡試圖用m來代替字元串”kidkl”,這是不成功的,正確方法為#define m “kidkl”

2 、邏輯預處理器指令:

2.1 、邏輯#if 指令:該指令原理與條件語句if相同,如果測試為真就執行後面的語句,如果為假則跳過後面的語句。該指令有兩種用法,其一可以用#if指令測試某個符號以前是否用#define指令定義過,這是最常用的用法,其二可以用來測試某個條件表達式是否為真。

2.2 、#if 指令用法一:測試某個符號是否以前用#define 定義過,該用法的指令如下#if defined 標識符 …. #endif 其縮寫形式為#ifdef 標識符….#endif表示如果,指定的標識符已被#define定義,則中間的語句就包含在源檔案中,如果該標識符還未被#define定義,則跳過#if和#endif之間的語句,該語句以#endif結束,還要注意的是標識符前的關見字是defined比define多一個字母d。

2.3 、測試標識符是否不存在:其語法為#if !defined 標識符…..#endif縮寫形式為#ifnedf 標識符…..#endif表示如果指定的標識符沒有定義,則把#if和#endif之間的語句包含在源檔案中,如果標識符已定義則跳過#if和#endif之間的代碼,實標上#ifndef語句比#ifdef語句使用得更頻繁,因為系統使用該語句防止頭檔案被多次包含,

2.4 、防止頭檔案被包含多次的方:其方法為#ifndef HY #define HY語句#endif程式在開始遇到標識符HY時沒有被定義,這時執行後面的語句,再第二次被使用時則標識符HY已經被定義,這時不會執行後面的語句,從而防止了同一頭檔案被包含多次的情況。這裡要注意使用#define後面定義的標識符不需要值。

2.5、#if語句還可以使用邏輯運算符以測試多個值,比如#if defined HY1&&HY2….#endif當HY1與HY2都為真時才執行,同樣還可以使用其他邏輯運算符。

2.6 、#if 指令用法二:測試某個表達式的值是否為真,其語法格式為:#if 常量表達式….#endif,注意常量表達式的求值結果應是整數常量表達式,比如#if a=2 …. #endif測試a的值是否為2,如果為2則執行#if與#endif之間的語句。

2.7、多個#if選擇塊:和常規的if語句一樣#if也有對應的#else和#elif語句,比如#if a=3 …. #else …. #endif表示如果a=3則執行if後面且在#else前面的語句,如果為假則執行#else與#endif間的語句。#elif用來實現多個選擇,該語句和常規語句的else if相似,比如#if a=1 …. #elif a=2 …. #elif a=3…. #else …. #endif表示,如果a=1則執行#if後的語句,如果a=2則執行該條件後的語句。

相關詞條

熱門詞條

聯絡我們