符號和雜項
C 標準說 #include <header.h>
和 #include "header.h"
符號之間的差別很小。
[
#include <header.h>
]搜尋一系列實現定義的位置,以查詢由<
和>
分隔符之間的指定序列唯一標識的標頭,並使標頭的整個內容替換該指令。如何指定位置或標識的標頭是實現定義的。
[
#include "header.h"
]導致由…
分隔符之間的指定序列標識的原始檔的全部內容替換該偽指令。以實現定義的方式搜尋指定的原始檔。如果不支援此搜尋,或者搜尋失敗,則會重新處理該指令,就好像它已讀取[#include <header.h>
] …
因此,雙引號形式可能看起來比角括號形式更多的地方。該標準通過示例指定標準頭應該包含在尖括號中,即使編譯在你使用雙引號時也能正常工作。同樣,POSIX 等標準使用角度括號格式 - 你也應該這樣做。為專案定義的標題保留雙引號標題。對於外部定義的標題(包括專案所依賴的其他專案的標題),角括號表示法是最合適的。
請注意,#include
和標題之間應該有一個空格,即使編譯器不會在那裡接受空格。空間很便宜。
許多專案使用如下符號:
#include <openssl/ssl.h>
#include <sys/stat.h>
#include <linux/kernel.h>
你應該考慮是否在專案中使用該名稱空間控制元件(這可能是一個好主意)。你應該避開現有專案使用的名稱(特別是 sys
和 linux
都是不好的選擇)。
如果你使用它,你的程式碼在使用符號時應該小心和一致。
不要使用 #include "../include/header.h"
表示法。
如果定義變數,標頭檔案應該很少。儘管你將全域性變數保持在最小值,但如果需要全域性變數,則將其標頭宣告並在一個合適的原始檔中定義,並且該原始檔將包含用於交叉檢查宣告和定義的標頭,以及使用該變數的所有原始檔都將使用標頭來宣告它。
推論:你不會在原始檔中宣告全域性變數 - 原始檔只包含定義。
標頭檔案應該很少宣告 static
函式,除了 static inline
函式之外,如果在多個原始檔中需要該函式,它將在標頭檔案中定義。
- 原始檔定義全域性變數和全域性函式。
- 原始檔不宣告全域性變數或函式的存在; 它們包括宣告變數或函式的標頭。
- 標頭檔案宣告全域性變數和函式(以及型別和其他支援材料)。
- 標頭檔案不定義變數或除(
static
)inline
函式之外的任何函式。