创建全局常量 C 字符串的正确方法
Proper way to create global constant C strings
我正在使用 C,这就是我用来实例化全局 C 字符串的方法
在单个文件的header中
const char SINGLE_MSG[] = "single msg";
在所有其他文件的 header 中
extern const char SINGLE_MSG[];
在 C 模式下编译时它总是工作正常,但在 C++ 模式下编译时似乎会产生 binder 错误。这是此类错误的示例:
pksw_nd_proc_test2.dev32.i0.pr.obj : error LNK2001: unresolved external symbol "char const * const SINGLE_MSG" (?SINGLE_MSG@@3QBDB)
我看到过类似的 question,他们还指定了缓冲区长度。我宁愿不这样做,因为如果我决定更改源中的字符串值,我不想记住更改它。这就是使它成为全局的重点,因此每个实例都看到相同的值。
我是不是做错了什么?
既然是常量,是不是也静态化比较好?只要我不必在源中手动复制字符串值来进行初始化,我就可以拥有它的额外副本。
编辑:请注意,我正在使用我无法完全控制的程序。这是一个网络模拟器,可以让我为每个节点定义一个 "header block"。我没有任何方法可以将一个节点的 header 显式包含在另一个节点的 header 中。
这就是我在 C 中使用 extern 的原因,两种语言之间全局变量的不同工作方式可能是我遇到链接器错误的原因。
根据答案,解决方案是制作一个新的、单独的 header 文件,其中包含全局变量的定义,并将其包含在所有其他 header 中。
当您在 header 中创建全局常量变量时,该变量实际上永远不会提交到内存。
取而代之的是,任何使用该变量的代码都会简单地将任何引用替换为 "single msg"。
这意味着不需要使用 extern,但反过来也意味着如果您使用该变量,则必须始终包含 header。
extern 的实际用途是将已在 .cpp 文件中声明并因此位于内存中某处的变量暴露给其他 cpp 文件。仅当您需要全局但动态的变量时才需要这样做。
我正在使用 C,这就是我用来实例化全局 C 字符串的方法
在单个文件的header中
const char SINGLE_MSG[] = "single msg";
在所有其他文件的 header 中
extern const char SINGLE_MSG[];
在 C 模式下编译时它总是工作正常,但在 C++ 模式下编译时似乎会产生 binder 错误。这是此类错误的示例:
pksw_nd_proc_test2.dev32.i0.pr.obj : error LNK2001: unresolved external symbol "char const * const SINGLE_MSG" (?SINGLE_MSG@@3QBDB)
我看到过类似的 question,他们还指定了缓冲区长度。我宁愿不这样做,因为如果我决定更改源中的字符串值,我不想记住更改它。这就是使它成为全局的重点,因此每个实例都看到相同的值。
我是不是做错了什么?
既然是常量,是不是也静态化比较好?只要我不必在源中手动复制字符串值来进行初始化,我就可以拥有它的额外副本。
编辑:请注意,我正在使用我无法完全控制的程序。这是一个网络模拟器,可以让我为每个节点定义一个 "header block"。我没有任何方法可以将一个节点的 header 显式包含在另一个节点的 header 中。
这就是我在 C 中使用 extern 的原因,两种语言之间全局变量的不同工作方式可能是我遇到链接器错误的原因。
根据答案,解决方案是制作一个新的、单独的 header 文件,其中包含全局变量的定义,并将其包含在所有其他 header 中。
当您在 header 中创建全局常量变量时,该变量实际上永远不会提交到内存。
取而代之的是,任何使用该变量的代码都会简单地将任何引用替换为 "single msg"。
这意味着不需要使用 extern,但反过来也意味着如果您使用该变量,则必须始终包含 header。
extern 的实际用途是将已在 .cpp 文件中声明并因此位于内存中某处的变量暴露给其他 cpp 文件。仅当您需要全局但动态的变量时才需要这样做。