C/C++預處理淺析使用形式
文件包含
文件包含命令行的一般形式為:
#include"文件名" 或 #include<文件名>
值得注意的是,
(1)<>表示在包含文件目錄中去查找(包含目錄是由用戶在設置環(huán)境時設置的include目錄),而不在當前源文件目錄去查找;
(2) ""則表示首先在當前源文件目錄中查找,若未找到才到包含目錄中去查找。
(3)一個include命令只能指定一個被包含文件,若有多個文件要包含,則需用多個include命令。
(4)一個包含文件中可以包含別的包含文件。
宏定義
C語言程序中廣泛的使用宏定義,采用關鍵字define進行定義,宏只是一種簡單的字符串替換,根據(jù)是否帶參數(shù)分為無參和帶參。
無參數(shù)的宏
#define 宏名 一段符號
其中一段符號表示你需要的用宏名來代替的一段符號,在編譯預處理時,程序中出現(xiàn)的所有你設定的宏名都將被這段符號代替。
樣例:#defineip114514
表示程序中出現(xiàn)的所有ip都將表示114514。
測試:
#include <stdio.h> #define ip 114514 int main() { int a = ip; printf("%d\n",a); return 0; }
結果:
一般我們使用宏定義是為了方便修改和管理代碼。
需要注意的是宏定義不作語法檢查,只有在編譯被宏展開后的源程序才會報錯。
測試1:
#include <stdio.h> #define ip 1+2 = 3 int main() { int a = 0; printf("%d\n", a); return 0; }
結果:
這里沒使用宏,宏沒被展開,宏沒做語法檢查而不報錯。
測試2:
#include <stdio.h> #define ip 1+2 = 3 int main() { int a = ip; printf("%d\n", a); return 0; }
結果:
宏被展開了,直接編譯報錯。
帶參宏定義
#define 宏名(形參表) 字符串
在宏定義中的參數(shù)稱為形式參數(shù),在宏調用中的參數(shù)稱為實際參數(shù)。
對帶參數(shù)的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。
樣例:#define MULTIPLY_2(x,y) ((x)*(y))
注意:在這個宏中,x和y作為參數(shù)在表達式中,應被括號分隔開。也就是說當宏中有表達式時,其內部參數(shù)需被括號獨立,防止程序出錯。
樣例:
#include <stdio.h> #define a1(x,y) (x*y) #define a2(x,y) ((x)*(y)) int main() { int a = 1; int b = 2; int sum1 = a1(a + b, b);//sum1=(a+b*b) int sum2 = a2(a + b, b);//sum2=((a+b)*b) printf("%d %d\n", sum1,sum2); return 0; }
結果:
條件編譯
一般情況下,源程序中所有的行都參加編譯。但有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是條件編譯。
樣例1:
#include <stdio.h> #define a1(x,y) (x*y) #define a2(x,y) ((x)*(y)) int main() { int a = 1; int b = 2; int sum1 = a1(a + b, b); int sum2 = 0; #ifdef a2 //這里只是檢查宏有沒有定義,并不檢查值 if (a == 1) { sum2 = a2(a + b, b); } #else if (a == 2) { int sum2 = a2(a + b, b); } #endif { printf("%d %d\n", sum1,sum2); } return 0; }
結果:
樣例2:
#include <stdio.h> #define a1(x,y) (x*y) //#define a2(x,y) ((x)*(y)) int main() { int a = 1; int b = 2; int sum1 = a1(a + b, b); int sum2 = 0; #ifdef a2 //這里只是檢查宏有沒有定義,并不檢查值 if (a == 1) { sum2 = a2(a + b, b); } #else sum2 = sum1; #endif { printf("%d %d\n", sum1,sum2); } return 0; }
結果:
顯而易見的,宏有沒有定義直接影響了程序運行的結果。
ps:c編譯器中,有幾個特殊形式的預定義宏需要我們注意。
__FILE__ 宏所在文件的源文件名
__FUNCTION__宏所在函數(shù)名
__LINE__宏所在行的行號
__DATE__ 代碼編譯的日期
__TIME__ 代碼編譯的時間
樣例:
#include <stdio.h> #define a1(x,y) (x*y) //#define a2(x,y) ((x)*(y)) int main() { int a = 1; int b = 2; int sum1 = a1(a + b, b); int sum2 = 0; #ifdef a2 //這里只是檢查宏有沒有定義,并不檢查值 if (a == 1) { sum2 = a2(a + b, b); } #else sum2 = sum1; #endif { printf("%d %d\n", sum1,sum2); } printf("文件名:%s\n", __FILE__); printf("函數(shù)名:%s\n", __FUNCTION__); printf("行 號:%d\n", __LINE__); // printf("日 期:%s\n", __DATE__); // printf("時 間:%s\n", __TIME__); // return 0; }
結果:
到此這篇關于C/C++預處理淺析使用形式的文章就介紹到這了,更多相關C++預處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++ 中的INT_MAX,INT_MIN數(shù)值大小操作
這篇文章主要介紹了C++ 中的INT_MAX,INT_MIN數(shù)值大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03劍指offer之C++語言實現(xiàn)鏈表(兩種刪除節(jié)點方式)
今天小編就為大家分享一篇關于劍指offer之C++語言實現(xiàn)鏈表(兩種刪除節(jié)點方式),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02