名稱空間
變體
操作

預處理器

來自 cppreference.com
< cpp
 
 
C++ 語言
 
 

預處理器在編譯前,於翻譯階段4執行。預處理的結果是一個單獨的檔案,然後傳遞給實際的編譯器。

目錄

[編輯] 指令

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

  • # 字元。
  • 一個序列
  • 標準定義的指令名稱(列於下方)後跟相應的引數,或
  • 一個或多個預處理標記,其中起始標記不是標準定義的指令名稱,在這種情況下,該指令是條件支援的,其語義由實現定義(例如,一個常見的非標準擴充套件是指令#warning,它在編譯期間發出使用者定義的訊息)(C++23前),或
  • 無,在這種情況下指令無效。
  • 一個換行符。

模組和匯入指令也是預處理指令。

(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控制,並使用__has_include檢查(C++17起))。
  • 引起錯誤警告(C++23起)(分別由指令#error#warning控制(C++23起))。

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

  • 實現定義的行為(由指令#pragma和運算子_Pragma(C++11起)控制)。此外,一些編譯器支援(不同程度地)運算子__pragma作為非標準擴充套件。
  • 檔名稱和行資訊可供預處理器使用(由指令#line控制)。

[編輯] 缺陷報告

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

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

[編輯] 另請參閱

C++文件關於預定義宏符號
C++文件關於宏符號索引
C文件關於預處理器