C++ 預(yù)處理命令
發(fā)布時間:2023-12-06 13:43:22
C++是從C語言發(fā)展過來,預(yù)處理也是繼承自C語言。預(yù)處理是在編譯之前進行的處理,C/C++的預(yù)處理主要是宏定義、文件包含、條件編譯。
1、預(yù)處理指令
預(yù)處理指令是以#
號開頭的代碼行,#
號必須是該行除了任何空白字符外的第一個字符。#
后是指令關(guān)鍵字,在關(guān)鍵字和 #
號之間允許存在任意個數(shù)的空白字符,整行語句構(gòu)成了一條預(yù)處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉(zhuǎn)換。
常用的預(yù)處理指令:
指令 | 描述 |
#define | 定義宏 |
#include | 包含一個源代碼文件 |
#undef | 取消已定義的宏 |
#ifdef | 如果宏已經(jīng)定義,則返回真 |
#ifndef | 如果宏沒有定義,則返回真 |
#if | 如果給定條件為真,則編譯下面代碼 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 給定條件不為真,當(dāng)前條件為真,則編譯下面代碼 |
#endif | 結(jié)束一個 #if……#else 條件編譯塊 |
#error | 當(dāng)遇到標(biāo)準(zhǔn)錯誤時,輸出錯誤消息 |
#pragma | 使用標(biāo)準(zhǔn)化方法,向編譯器發(fā)布特殊的命令到編譯器中 |
2、宏定義(#define)
宏定義又稱為宏代換、宏替換,簡稱“宏”。
1) 不帶參數(shù)的宏定義
格式如下:
#define 標(biāo)識符 文本
其中的標(biāo)識符就是所謂的符號常量,也稱為“宏名”。
例如,
#define PI 3.1415926
注意:
宏名一般用大寫
使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便于修改。例如:數(shù)組大小常用宏定義
可以用#undef
命令終止宏定義的作用域
宏定義可以嵌套
2)帶參數(shù)的宏
除了一般的字符串替換,還要做參數(shù)代換。
格式如下:
#define 宏名(參數(shù)表) 文本
例如,
#define S(a,b) a*b
將area=S(3,2);
進行宏替換,第一步被換為area=a*b;
,第二步被換為area=3*2;
注意:有時宏替換后和我們預(yù)期的結(jié)果不一樣需要注意一下,宏替換只是簡單的替換。
3、文件包含
C++ 程序文件中一個文件包含另一個文件的內(nèi)容。
格式如下:
#include "文件名"
或
#include <文件名>
常見用法:
#include <iostream> //標(biāo)準(zhǔn)庫頭文件
#include <iostream.h> //舊式的標(biāo)準(zhǔn)庫頭文件
注意:iostream.h
只支持窄字符集,iostream
則支持窄/寬字符集。一般使用iostream
相關(guān)文檔: C語言中#include <filename> 和 #include "filename"的區(qū)別
編譯時以包含處理以后的文件為編譯單位,被包含的文件是源文件的一部分。
編譯以后只得到一個目標(biāo)文件.obj
被包含的文件又被稱為“標(biāo)題文件”或“頭部文件”、“頭文件”,并且常用.h作擴展名。
修改頭文件后所有包含該文件的文件都要重新編譯
頭文件的內(nèi)容除了函數(shù)原型和宏定義外,還可以有結(jié)構(gòu)體定義,全局變量定義:
1)一個#include命令指定一個頭文件;
2)文件1包含文件2,文件2用到文件3,則文件3的包含命令#include應(yīng)放在文件1的頭部第一行;
3)包含可以嵌套;
4)<文件名>稱為標(biāo)準(zhǔn)方式,系統(tǒng)到頭文件目錄查找文件,"文件名"則先在當(dāng)前目錄查找,而后到頭文件目錄查找;
5)被包含文件中的靜態(tài)全局變量不用在包含文件中聲明。
4、 條件編譯
有些語句在條件滿足時才編譯。例如,不同平臺使用不同的代碼實現(xiàn),需要針對平臺來編譯。
格式:
#ifdef 標(biāo)識符
程序段1
#else