C++ include標頭檔案引入規則

漫山华發表於2024-04-29

include引入標頭檔案規則

語法定義

C++中include關鍵字用於引入其他標頭檔案。在程式處於預處理階段時,會將目標引入的標頭檔案的內容新增該指令的位置。引入語法見如下2種方式:

// 語法1
#include <example_header1>

// 語法2
#include "example_header2"
  1. 語法1會搜尋由example_header1唯一識別的標頭,並將該指令替換為這個標頭的全部內容。在一系列由實現定義的地點中搜尋由example_header1唯一識別的標頭,並將該指令替換為這個標頭的全部內容。由實現定義如何制指定這些地點和識別標頭。
  2. 語法2會搜尋由example_header2識別的原始檔,並將該指令替換為這個原始檔的全部內容。可能退回至方式1並將example_header2視為標頭識別符號,將該指令替換為由example_header2識別的原始檔的全部內容。所指名的原始檔透過由實現定義的方式進行搜尋。如果不支援這種搜尋或者搜尋失敗,該指令按語法1重新處理,將原指令中包含的序列(包括大於號,如果存在)作為語法1中所需的序列。

內容參考連結:
原始檔包含 - cppreference.com

GCC-11.4.0實現

以上兩種語法所使用的標頭檔案搜尋路徑由具體編譯器實現定義,目前C++專案開發主要使用GCC作為主要編譯工具鏈。GCC對於include語法實現規則如下:

  1. 對於#include <file>語法:用於引入系統標頭檔案,它在系統目錄的標準列表中搜尋檔名檔案,可以在編譯時使用-I選項將目錄前置到該列表中。對於Ubuntu系統而言,系統預設搜尋路徑為/usr/include/usr/local/include
  2. 對於#include "file"語法:用於自己專案的標頭檔案,它在當前檔案所在目錄搜尋檔名檔案,可以在編譯時使用-iquote選項將自定義目錄新增至搜尋目錄;如果搜尋失敗,則會退化為include <file>方式繼續搜尋。

#include的引數,無論是用引號還是尖括號分隔,其行為都像字串常量,因為註釋無法識別,宏名稱也無法展開。因此,#include<x/*y>指定包含名為x/*y的系統標頭檔案。但,若反斜槓出現在檔案中,它們將被視為普通文字字元,而不是跳脫字元。不處理任何適用於C中字串常量的字元轉義序列。因此,#include "x\n \\y"指定一個包含三個反斜槓的檔名(有些系統將“\”解釋為路徑名分隔符。所有這些系統也以相同的方式解釋“/”。僅使用“/”最便於移植。)。如果檔名後面的行中有任何內容(註釋除外),則為錯誤。
內容參考連結:
Include Syntax (The C Preprocessor)

相關文章