我正在使用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)
我看到了一个类似的问题,其中它们还指定了缓冲区长度。我宁愿不这样做,因为如果我决定更改源中的字符串值,我不想记住更改过的内容。这就是使其全局化的关键,因此每个实例都看到相同的值。
我做错什么了吗?
既然它是一个常数,那么把它也设为静态会更好吗?只要我不必在源代码中手动复制字符串值来进行初始化,我就可以拥有它的额外副本。
编辑:请注意,我正在使用一个我无法完全控制的程序。它是一个网络模拟器,让我为每个节点定义一个"头块"。我没有任何方法可以将一个节点的标头显式地包含在另一个节点中。
这就是我在C中使用extern的原因,这两种语言之间全局变量的不同工作方式可能是我出现链接器错误的原因。
根据答案,解决方案是制作一个新的、单独的头文件,其中包含全局变量的定义,并将其包含在所有其他头文件中。
当您在标头中创建全局常量变量时,该变量实际上从未被提交到内存中。
相反,任何使用该变量的代码都会简单地将任何引用替换为"single-msg"。
这意味着不需要使用extern,但反过来意味着如果使用变量,则必须始终包含该标头。
extern的实际用途是将一个在.cpp文件中声明的变量公开给其他cpp文件,该变量因此位于内存中的某个位置。只有当您想要一个全局但动态的变量时,这才是必要的。