命名空間
變體
動作

前處理器

出自 cppreference.com
< cpp
 
 
C++ 語言
一般主題
前處理器
註解
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

預處理器會在轉譯階段 4,即編譯之前執行。預處理的結果是一個單一檔案,隨後會傳遞給實際的編譯器。

目錄

[編輯] 指令

預處理指令用於控制預處理器的行為。每個指令佔用一行,並具有以下格式:

  • # 字元。
  • 一連串的
  • 一個標準定義的指令名稱(列於下方),後接對應的引數,或者
  • 一個或多個預處理標記 (preprocessing tokens),其中起始標記不是標準定義的指令名稱,在此情況下,該指令屬於條件支援 (conditionally-supported),語意由實作定義(例如,一個常見的非標準擴充是指令 #warning,它會在編譯期間發出使用者定義的訊息)(C++23 前),或者
  • 什麼都沒有,在此情況下該指令無效。
  • 一個換行符。

模組與匯入指令 (module and import directives) 同樣屬於預處理指令。

(自 C++20 起)

預處理指令不可來自巨集展開。

#define EMPTY
EMPTY   #   include <file.h> // not a preprocessing directive

[編輯] 功能

預處理器具有以下原始碼檔案轉譯功能:

  • 條件式編譯原始碼檔案的某些部分(由指令 #if#ifdef#ifndef#else#elif#elifdef#elifndef(C++23 起) 以及 #endif 控制)。
  • 替換文字巨集,同時可能連接或引用識別字(由指令 #define#undef,以及運算子 ### 控制)。
  • 包含 (include) 其他檔案(由指令 #include 並透過 __has_include 檢查(C++17 起) 控制)。
  • 引發 錯誤 警告(C++23 起)(分別由指令 #error#warning 控制(C++23 起))。

預處理器的以下方面可被控制:

  • 實作定義的行為(由指令 #pragma 及運算子 _Pragma(C++11 起) 控制)。此外,部分編譯器(在不同程度上)支援運算子 __pragma 作為一種非標準擴充。
  • 檔案名稱與行號資訊(由指令 #line 控制)。

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。

DR 應用於 出版時的行為 正確的行為
CWG 2001 C++98 使用非標準定義指令的行為不明確 改為條件支援

[編輯] 參閱

C++ 文件 關於 預定義巨集符號 (Predefined Macro Symbols)
C++ 文件,關於 巨集符號索引
C 文件 關於 預處理器
English Deutsch 日本語 中文(简体) 中文(繁體)