簡體   English   中英

為什么要使用extern關鍵字在命名空間范圍內聲明變量?

[英]Why should I use the extern keyword to declare variables in a namespace scope?

我是C ++的新手,目前正在學習它。 我有一些Java背景知識。

我希望有一個名為“消息”的名稱空間,該名稱空間將用於存儲不變的/不變的字符串,這些字符串將在我的程序中的各種不同類中使用。 (例如標題,關鍵字,名稱等)。

如果所有這些字符串都在一個類中,則它們將是const和static,因此我覺得最好將它們放在命名空間而不是類中。 我當前的“ Message.h”看起來像這樣:

#ifndef MESSAGE
#define MESSAGE

#include <string>

namespace Message {
    const std::string NAME = "Car";
    const std::string SEPARATE = " | ";
    const std::string COMMAND = "Please enter a 1, 2 or a 3: ";
};

#endif MESSAGE

直到老師建議我將其更改為...

Message.h:

#ifndef MESSAGE
#define MESSAGE

#include <string>

namespace Message {
    extern const std::string NAME;
    extern const std::string SEPARATE;
    extern const std::string COMMAND;
};

#endif MESSAGE

Message.cpp:

#include "Message.h"

const std::string Message::NAME = "Car";
const std::string Message::SEPARATE = " | ";
const std::string Message::COMMAND = "Please enter a 1, 2 or a 3: ";

在課程結束之前,我幾乎沒有時間從講師那里澄清一下,而且還有很長時間我才有機會參加。 根據我的研究,它與翻譯單元有關,更具體地說,是嘗試在其他翻譯單元中使用變量。

我了解這個基本概念,但是我不能完全理解在這種情況下使用extern的好處?

包含防護在這里是否足夠,使得Message ::名稱空間變量不會被聲明/定義一次以上? 為什么在這種情況下推薦使用extern關鍵字,而這純粹是出於編譯速度的好處?

兩者都可以正常工作(盡管問題已經被人們所嘲笑)。 區別有點微妙。

在第一個示例中,包括該標頭的每個翻譯單元(如.cpp文件)將獲得這三個字符串中每個字符串的副本。 可以這樣做,因為它們被標記為const ,所以它們不會從翻譯單元中導出。 如果它們不是const您將具有相同符號的多個定義。

在第二個示例中,三個字符串中的每個字符串都只有一個副本。 這些副本位於Message.cpp中,並將鏈接到您的可執行文件中。 任何包含Message.h的翻譯單元都將知道這些名稱,因為它們在標頭中聲明,並且可以使用它們。

對於常量int值之類的小事情,第一種方法是最常見的。 對於較大的事物,例如字符串對象(通常需要非平凡的初始化的事物),第二種方法最為常見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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