我正在使用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的原因,并且全局变量在两种语言之间工作的方式可能是我得到链接器错误的原因。
根据答案,解决方案是创建一个包含全局变量定义的新的单独头文件,并将其包含在所有其他头文件中。
答案 0 :(得分:1)
在标头中创建全局常量变量时,该变量实际上从未实际提交到内存。
相反,使用该变量的任何代码都只是用“single msg”替换任何引用。
这意味着不需要使用extern,但反过来意味着如果使用变量,则必须始终包含该标题。
实际使用的extern是将一个已在.cpp文件中声明的变量暴露给其他cpp文件,因此在某个地方的内存中。只有在需要全局但动态的变量时才需要这样做。