C++的前置處理器包括如下12個。
#if #else #elif #endif #ifdef #ifndef #undef
#error #line #pragma #include #define
第一行7個就是控制語句,重點在後面5個。
1. #define
#define macro-name char-sequence
#define定義了一個標識符和一個字元序列。每次在來源程式中遇到該標識符就用定義的字元序列替代它。
標識符被即宏名;替換過程即宏替換。
#define ONE 1
#define TWO ONE + ONE
#define PI 3.14
#define ERRMSG "ERR!!!"
//.......
printf(ERRMSG);
宏定義中如果字元序列超過一行,可以在末尾用反斜線續行
#define LONGSTRING "this is a very very \
very very.......\
long string"
宏名不一定要大些,但C++程式員大都習慣用大些字母。並且習慣常將所有的宏集中在一或多個單獨的標頭檔中。
宏名可以有變元。遇到宏名時,其定義中所用的變元均由實際程式中的變元來代替。這一點很像inline函數。但define的對象,編譯器只是做簡單的字元替換,其他動作例如類型檢查。應盡量使用inline來代替define。
#include <stdio.h>
#define ABS(a) (a)<0? -(a) :(a) // 這裡的括弧很重要
int main(void)
{
printf("abs of -1 and 1: %d %d", ABS(-1), ABS(1));
return 0;
}
#error
#error error-message // error message不用雙引號括起來
#error主要用在調試中,強迫編譯器停止編譯 。錯誤資訊會隨編譯的其他資訊一同顯示。
#include
#include <xx.h> //使用編譯器建立者定義的方式尋找
//通常是從項目定義的眾多包含目錄下開始
#include "xx.h" //使用其他實現所定義的方式尋找
//通常是從當前工作目錄開始,
//如未找到,則按<>的規定繼續尋找
#line
#line number "filename"
用來改變__LINE__和__FILE__的內容。這兩個標識符是編譯器中預先定義的標識符。
前者表示已編譯的程式碼數,後者是一字串,包含已編譯的源檔案名稱。
number為__LINE__的新值,filename為任意有效檔案名稱標識符,是__FILE__ 的新值。
#pragma
#pragma是一個實現時定義的指令,用它向編譯器傳送各種指令。例如
#pragma once
#和##前置處理器運算子
#和##與#define一起使用。
#,stringize運算子,使它後面的變元轉換成帶引號的串。
#include <stdio.h>
#define mkstr(s) #s
int main(void)
{
//I like C++ 就是mkstr宏中的s,
//前置處理器將這一大串加上引號變成"I like C++"
printf(mkstr(I like C++));
return 0 ;
}
##,pasting運算子,用於串連兩個符號。
#include <stdio.h>
#define concat(a,b) a##b
int main(void)
{
int xy = 10;
printf("%d", concat(x,y)); //前置處理器將其變成列印xy的值
return 0 ;
}
預定義的宏名
__LINE__ __FILE__ __DATE__ __TIME__ __STDC__ __cplusplus