gpt4 book ai didi

c++ - 为什么要使用 extern 关键字在命名空间范围内声明变量?

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:07 28 4
gpt4 key购买 nike

我是 C++ 的新手,目前正在参加有关它的短期类(class)。我有一些 Java 背景。

我希望有一个名为“Message”的命名空间,它将用于存储将在我的程序中的各种不同类中使用的不变/常量字符串。 (例如标题、关键字、名称等)。

如果所有这些字符串都在一个类中,它们将是常量和静态的,因此我觉得最好将它们放入命名空间而不是类中。我当前的“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

直到老师建议我改成这样...

消息.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

消息.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: ";

在类(class)结束之前,我几乎没有时间从讲师那里得到澄清,而且我要过一段时间才能有机会这样做。根据我的研究,它与翻译单元有关,更具体地说,是尝试在不同的翻译单元中使用变量。

我理解这个的一般概念,但我不太明白在这种情况下使用 extern 的好处?

这里的 include 守卫是否足以使 Message:: namespace 变量不会被声明/定义多次?为什么在这种情况下推荐使用 extern 关键字,这纯粹是为了提高编译速度吗?

最佳答案

两者都可以正常工作(尽管这个问题得到了下意识的评论)。区别有点微妙。

在第一个示例中,包含该 header 的每个翻译单元(想想 .cpp 文件)都将获得这三个字符串中每一个的拷贝。这样做没问题,因为它们被标记为 const,所以它们不会从翻译单元中导出。如果它们不是 const,您将对同一符号有多个定义。

在第二个例子中,三个字符串各有一份。这些拷贝位于 Message.cpp 中,并将链接到您的可执行文件中。任何包含 Message.h 的翻译单元都会知道这些名称,因为它们是在 header 中声明的,并且可以使用它们。

对于像常量 int 值这样的小事情,第一种方法是最常见的。对于更大的事物,例如字符串对象(通常需要非平凡初始化的事物),第二种方法是最常见的。

关于c++ - 为什么要使用 extern 关键字在命名空间范围内声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53996756/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com