我正在學習 C 中的多檔案編譯,并發現了這樣的做法:
#ifndef MY_LIB_H
#define MY_LIB_H
void func(int a, int b);
#endif
有人說,采取這種做法是為了避免重復申報。但是我嘗試兩次宣告一個函式,并且代碼運行良好,沒有任何編譯錯誤(如下所示)。
int func();
int func();
int func()
{
return 1;
}
那么真的有必要避免重復宣告嗎?還是有其他使用原因#ifndef?
uj5u.com熱心網友回復:
有人說,采取這種做法是為了避免重復申報。
如果有人這么說,那么他們所說的就是誤導。標頭保護用于避免重復定義,以符合單一定義規則。
uj5u.com熱心網友回復:
重復宣告是可以的。重復定義不是。
int func(); // declaration
int func(); // declaration; repetition is okay
class X; // declaration
class X; // declaration; repetition is okay
class Y {}; // definition
class Y {}; // definition; repetition is not okay
如果標頭僅包含宣告,則可以包含多次。但這是低效的:編譯器必須編譯每個宣告,確定它只是重復,然后忽略它。當然,即使它目前僅包含宣告,某些未來的維護者(包括您)也會在某個時候更改它。
uj5u.com熱心網友回復:
那么真的有必要避免重復宣告嗎?
對于給定的物體(名稱),您可以有多個宣告。也就是說,您可以在給定范圍內重復宣告。
使用#ifndef 還有其他原因嗎?
使用頭保護的主要原因是確保頭檔案第二次#included被丟棄,其內容被丟棄,從而避免它可能包含的類、行內物體、模板等的重復定義。
換句話說,使程式符合單一定義規則(又名 ODR)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442166.html
