4 回答

TA貢獻1860條經驗 獲得超8個贊
唯一的方法是閱讀您的實現文檔。
在C標準中,第6.10.2節第2至4段規定:
表單的預處理指令
#include <h-char-sequence> new-line搜索的用于實現定義的地方的序列報頭由之間的指定序列唯一地識別
<
和>
分隔符,并且使得由所述的全部內容替換該指令的標頭。如何指定場所或標識的頭是實現定義的。表單的預處理指令
#include "q-char-sequence" new-line導致由分隔符之間的指定序列標識的源文件的全部內容替換該指令
"
。以實現定義的方式搜索指定的源文件。如果不支持此搜索,或者搜索失敗,則會重新處理該指令,就像它讀取一樣#include <h-char-sequence> new-line使用
>
原始指令中相同的包含序列(包括字符,如果有的話)。表單的預處理指令
#include pp-tokens new-line(允許與前兩種形式中的一種不匹配)。
include
指令中的預處理標記處理與正常文本一樣。(當前定義為宏名稱的每個標識符將替換為其預處理標記的替換列表。)所有替換后生成的指令應與前兩個表單中的一個匹配。將a<
和>
預處理令牌對或一對"
字符之間的一系列預處理標記組合成單個標題名稱預處理標記的方法是實現定義的。定義:
h-char:源字符集的任何成員,除了換行符和
>
q-char:源字符集的任何成員,除了換行符和
"

TA貢獻1836條經驗 獲得超4個贊
<和>之間的字符序列唯一地引用標題,該標題不一定是文件。實現幾乎可以隨意使用字符序列。(但是,大多數情況下,只需將其視為文件名并在包含路徑中進行搜索,就像其他帖子所述。)
如果使用該#include "file"
表單,則實現首先查找給定名稱的文件(如果支持)。如果不是(支持),或者搜索失敗,則實現的行為就像使用了other(#include <file>
)形式一樣。
此外,存在第三種形式,當#include
指令與上述任何一種形式都不匹配時使用。在這種形式中,一些基本的預處理(例如宏擴展)在#include
指令的“操作數”上完成,并且結果預期與其他兩種形式中的一種匹配。

TA貢獻1770條經驗 獲得超3個贊
這里的一些好的答案引用了C標準,但忘記了POSIX標準,特別是c99(例如C編譯器)命令的特定行為。
根據The Open Group Base Specifications Issue 7,
-I 目錄
在查找常用位置之前,更改搜索名稱不是絕對路徑名的標頭的算法,以查找目錄路徑名所指定的目錄。因此,名稱以雙引號(“”)括起來的標題應首先在#include行的文件目錄中搜索,然后在-I選項中命名的目錄中搜索,最后在通常的位置搜索。對于名稱用尖括號(“<>”)括起來的標題,只能在-I選項中指定的目錄中搜索標題,然后在通常的位置搜索標題。在-I選項中命名的目錄應按指定的順序進行搜索。c99命令調用。
因此,在符合POSIX標準的環境中,使用符合POSIX標準的C編譯器,#include "file.h"
可能會首先搜索./file.h
,其中.
是帶有#include
語句的文件所在的目錄,同時#include <file.h>
,可能/usr/include/file.h
首先搜索,/usr/include
系統定義在哪里通常的標題位置(似乎沒有POSIX定義)。
- 4 回答
- 0 關注
- 1116 瀏覽
添加回答
舉報