這是一個預處理宏。
所有這一切都爲預處理器的語法,這基本上說,如果宏尚未定義,定義,幷包括#ifndef
和#endif
什麼它實現阻止文件包含超過之間的所有代碼一次,其中可以導致您的代碼中的問題。
你的問題:
爲什麼它好就忘了包括在這種情況下,我們也可以忘記加入的#define HEADER_FILE後衛?
可以忘記它,因爲它仍然是合法的C代碼沒有它。預處理器在編譯之前先處理文件,如果沒有邏輯說明它爲什麼不應該在最終的程序中包含指定的代碼。這只是一種常見的做法,但並不是必需的。
一個簡單的例子可以幫助說明這是如何工作:
你的頭文件,header_file.h
我們會說,這包含:
#ifndef HEADER_FILE
#define HEADER_FILE
int two(void){
return 2;
}
#endif
在另一個文件(foo.c
),你可能有:
#include "header_file.h"
void foo() {
int value = two();
printf("foo value=%d\n", value);
}
一旦「預處理」並準備編譯,這將轉化爲:
int two(void){
return 2;
}
void foo() {
int value = two();
printf("foo value=%d\n", value);
}
所有的包括防護裝置完成這裏是確定是否將#ifndef ...
和#endif
之間的標題內容應代替原來#include
的粘貼。
但是,由於該函數未被聲明爲extern
或static
,並且實際上是在頭文件中實現的,所以如果您嘗試在另一個源文件中使用它,則會出現問題,因爲函數定義將不包含在內。
你可能不應該在頭文件中包含代碼,因爲include guard只防止多個包含是一個單獨的翻譯單元。在兩個單獨的源文件中包含該頭文件可能會在鏈接時導致雙重定義錯誤。 – paxdiablo
嗯,代碼守衛內的非靜態函數定義。看起來像一個問題。 – chux
這是真的,值得注意。代碼防護可以防止在單個事務中包含多個內容,但是當兩個不同的對象文件單獨編譯並隨後鏈接時,不會防止多重包含。在C中爲 –