符號和雜項

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>

你應該考慮是否在專案中使用該名稱空間控制元件(這可能是一個好主意)。你應該避開現有專案使用的名稱(特別是 syslinux 都是不好的選擇)。

如果你使用它,你的程式碼在使用符號時應該小心和一致。

不要使用 #include "../include/header.h" 表示法。

如果定義變數,標頭檔案應該很少。儘管你將全域性變數保持在最小值,但如果需要全域性變數,則將其標頭宣告並在一個合適的原始檔中定義,並且該原始檔將包含用於交叉檢查宣告和定義的標頭,以及使用該變數的所有原始檔都將使用標頭來宣告它。

推論:你不會在原始檔中宣告全域性變數 - 原始檔只包含定義。

標頭檔案應該很少宣告 static 函式,除了 static inline 函式之外,如果在多個原始檔中需要該函式,它將在標頭檔案中定義。

  • 原始檔定義全域性變數和全域性函式。
  • 原始檔不宣告全域性變數或函式的存在; 它們包括宣告變數或函式的標頭。
  • 標頭檔案宣告全域性變數和函式(以及型別和其他支援材料)。
  • 標頭檔案不定義變數或除(staticinline 函式之外的任何函式。

交叉引用