剛開始學習程序的時候,老師就說過用#ifndef 這樣的結構防止頭文件被重復包含,所以就沒有關心那么多。今天可能由於自家底層系統緣故,陳工說最好還是用#pragma once ,於是查了下兩個的區別,看了下大神們的博客,所以在此給自己記錄下。
兩種方式的使用
其一:
#ifndef _AICHANNELSET_H_ #define _AICHANNELSET_H_
函數聲明 #endif
其二:
#pragma once
函數聲明
第一點ifndef是通過判斷宏是否被定義,來決定該文件是否需要被編譯器包含編譯,一般宏的命名方式都是 _+文件名(大寫)+_H_這樣的形式,如果沒有define,那么就define一次好了,記得之前寫程序的時候很多時候都會忘記在最后加上#endif這個語句。有一個比較關鍵的地方就是這個宏千萬不能再別處定義,如果不小心在其他地方定義了,那就很簡單了,該文件沒有被包含嘛,程序會出現變量未聲明等錯誤。通過在網上查詢,有一種解釋就是,編譯器在執行編譯的時候都需要打開這個文件,然后判斷該文件是否被define 過,如果是大型工程的話,編譯過程就會很花費時間。而#pragma once 不同,它是編譯器來提供保證,它的判斷機制是物理上的文件是否相同,而不是內容相同的兩個文件,這樣就省去了重復打開文件操作。所以推薦使用#pragma once 這種寫法。
第二點就是#ifndef 是c/c++的標准,所以走到哪里都會被支持,而#pragma once 是#ifndef 之后產生的 一些老的編譯器可能不被支持。不過現在做開發很少人用Turbo C 或者vc 6 了吧。所以基本不存在什么問題。
第三點還有一種寫法就是兩者可以同時使用,像這樣。但是也沒查到也不清楚這樣寫有什么好處
#pragma once #ifndef _AICHANNELSET_H_ #define _AICHANNELSET_H_ #endif
第一次寫,再接再勵!