[英]Why should avoid redundant declarations in C++?
我在C++學習多文件編譯,發現有這樣的做法:
#ifndef MY_LIB_H
#define MY_LIB_H
void func(int a, int b);
#endif
有人說采用這種做法是為了避免重復申報。 但我嘗試聲明 function 兩次,代碼運行良好,沒有任何編譯錯誤(如下所示)。
int func();
int func();
int func()
{
return 1;
}
那么真的有必要避免重復聲明嗎? 或者還有其他使用#ifndef
的原因嗎?
有人說采用這種做法是為了避免重復申報。
如果有人這么說,那么他們所說的話就是誤導性的。 Header 守衛用於避免重復定義,以符合單一定義規則。
重復聲明是可以的。 重復定義不是。
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
如果 header 僅包含聲明,則可以多次包含它。 但這是低效的:編譯器必須編譯每個聲明,確定它只是一個副本,然后忽略它。 而且,當然,即使它目前僅包含聲明,某些未來的維護者(包括您)也會在某個時候更改它。
那么真的有必要避免重復聲明嗎?
對於給定的實體(名稱),您可以有多個聲明。 也就是說,您可以在給定的 scope 中重復聲明。
使用#ifndef還有其他原因嗎?
使用header 守衛的主要原因是確保header 文件第二次被#included
時,其內容被丟棄,從而避免重復定義class、內聯實體、模板等,它可能包含。
換句話說,使程序符合單一定義規則(又名 ODR)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.