簡體   English   中英

為什么要避免C++中的冗余聲明?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM