【问题标题】:Proper way to create global constant C strings创建全局常量 C 字符串的正确方法
【发布时间】:2015-02-25 19:31:00
【问题描述】:

我正在使用 C,这就是我正在做的实例化全局 C 字符串

在单个文件的头部

const char SINGLE_MSG[] = "single msg";

在所有其他文件的标题中

extern const char SINGLE_MSG[];

在 C 模式下编译时它总是可以正常工作,但在 C++ 模式下编译时似乎会产生绑定错误。以下是此类错误的示例:

pksw_nd_proc_test2.dev32.i0.pr.obj : error LNK2001: unresolved external symbol "char const * const SINGLE_MSG" (?SINGLE_MSG@@3QBDB)

我见过类似的question,他们还指定了缓冲区长度。我宁愿不这样做,因为如果我决定更改源中的字符串值,如果不想记住更改它。这就是使这个全局化的重点,所以每个实例都会看到相同的值。

我做错了吗?

既然它是一个常量,那么将它设为静态会更好吗?只要我不必在源代码中手动复制字符串值来进行初始化,就可以拥有它的额外副本。

编辑:请注意,我正在使用我无法完全控制的程序。这是一个网络模拟器,可以让我为每个节点定义一个“头块”。我没有任何方法可以将一个节点的标头显式包含在另一个节点的标头中。

这就是我在 C 中使用 extern 的原因,而这两种语言之间全局变量的不同工作方式可能是我得到链接器错误的原因。

根据答案,解决方案是制作一个新的、单独的头文件,其中包含全局变量的定义,并将其包含在所有其他头文件中。

【问题讨论】:

  • 在 C++ 中 const 默认意味着 static。解决此问题的一种方法是将定义 const char SINGLE_MSG[] = "single message"; 放入标题中,并将其包含在使用的每个文件中。然后链接器会将单独的实例合并为一个。
  • 是否有充分的理由在这里搞乱全局字符数组,而不是仅仅使用指向字符串字面量池的指针?
  • 我编辑了答案以指定为什么我不能将这些特定的标题包含在另一个标题中。我需要另一种方式来声明这个全局常量。

标签: c++ c string global-variables


【解决方案1】:

当您在标头中创建全局常量变量时​​,该变量实际上永远不会被提交到内存中。

相反,任何使用该变量的代码都会简单地将任何引用替换为“single msg”。

这意味着不需要使用 extern,但反过来确实意味着如果使用变量,则必须始终包含该标头。

extern 的实际用途是将已在 .cpp 文件中声明的变量公开给其他 cpp 文件,因此该变量位于内存中的某处。仅当您想要一个全局但动态的变量时才需要这样做。

【讨论】:

  • 谢谢。我将使用全局定义创建一个单独的头文件。这也将简化我的代码。我只需要指定一个自定义包含目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多