#pragma once
是寫在頭文件開頭的編譯指令,使得編譯器能夠自動幫我們實現“只編譯一次該頭文件”,從而避免了多次include該頭文件導致的重復定義/聲明問題。
在沒有#pragma once 之前,我們常用的方法是為這個頭文件制定一個獨一無二的宏名(比如說叫__Car__),然后使用#ifndef:
#ifndef __Car__ #def __Car__ //頭文件中的定義、聲明 //... #endif //__Car__
這兩種方法有幾點不同:
1.較早的編譯器並不支持#pragma once
2.如果兩個不一樣的頭文件用了同一個宏名,用#ifndef的方法就會出問題,相當於扔掉了一個頭文件
3.#pragma once 似乎只負責保證聲明的唯一性,並不保證實現的唯一性,具體來講:
#pragma once class Test { void func(); };
void Test::func()
{
//do sth.
}
上面這樣寫的話,有可能出現Test::func()這個函數被定義兩次的問題,而
#pragma once class Test { void func() { // do sth. } };
這樣寫就沒問題。估計用#ifndef 配合#endif的話也沒問題
(srds,頭文件里還是不要寫定義了,這里是因為是個OOP的題所以不得不寫在.h里面...)