【发布时间】: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