创建全局常量C字符串的正确方法
Proper way to create global constant C strings
我正在使用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文件,该变量因此位于内存中的某个位置。只有当您想要一个全局但动态的变量时,这才是必要的。
相关文章:
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 具有字符串化的可变参数宏的现代/通用方法
- 接收字符串并使用它来调用方法C++
- 如何分隔字符串并将标记传递给方法
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 在 C++11 中字符串化变量名称的替代方法
- 连接和压缩标准::vector<std::字符串的最佳方法>
- Esp8266 & Nodemcu:返回请求字符串的方法
- 将位字符串转储到二进制文件的最佳方法是什么
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 创建字符串数组的有效方法
- 如何使用字符串::replace方法写入文件
- 是否有更有效的方法来生成日期的REGEX字符串
- C++-将对象(如字符串)映射到表中成员函数的正确方法
- 有没有更快的方法从成员函数返回格式化字符串
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- 从c++中的类指针对象调用方法(字符串)