gpt4 book ai didi

c++ - 全局外部人员。字符串和字符之间的区别*

转载 作者:行者123 更新时间:2023-11-28 00:26:15 25 4
gpt4 key购买 nike

我有两个问题:

  1. 我曾经有一个 Constants.h 包含

    const std::string PATH("/ram/")

    而且效果很好。

    但是当我添加

    const char* BLAH = "blah";

    同一个文件。我在链接期间遇到重定义错误。

    我知道这是因为每个编译单元都创建了自己的常量,所以这会在链接期间引起问题,但为什么它之前对常规 std::strings 有效而不对 char*s 有效?

  2. 因此,在第一期之后,我决定将所有内容都设为 extern,现在我有了一个 Constants.h 和一个 Constants.cpp。但后来我遇到了另一个问题。我有另一个文件 Test.cpp,其中一个常量定义为

    const std::string FOO(PATH + "booyah");

    这用于创建“/ram/booyah”,但现在它只是“booyah”。 PATH 不知何故变空了。我猜它与 extern 以及在编译期间创建的常量有关。常量 PATH 在运行时工作正常。

这样理解正确吗?有没有办法让所有这些很好地协同工作?

提前致谢!

最佳答案

当某些东西是 const 时,它会自动变成 static,就像在内部链接中一样。

因此,当您使用 const std::string 时,它实际上是 static const std::string

这意味着每个编译单元都有自己的字符串拷贝,这会浪费内存,但通常不是什么大问题。

要解决这个问题,请在头文件中制作 extern const std::string s; 并在头文件中制作 extern const std::string s = "..";源文件。

为避免需要源文件,您可以尝试这种替代方法,尽管编译时间可能会更长。它还将只分配一次字符串。

inline const std::string& GetStr()
{
static const std::string s = "..";
return s;
}

现在,为什么 const char* BLAH 没有在 header 中编译?这是因为 BLAH 不是常数。虽然它是只读指针,但指针不是常量,可以更改为指向其他内容。

要使代码像使用 const std::string 那样编译,您必须使用 const char *const BLAH = "..";。现在它是一个真正的常量,并将编译为 static。这也遇到了同样的问题,即每个编译单元都会收到一份指针拷贝。它还可能会收到字符串文字的拷贝,具体取决于编译器优化。您可以使用上面的 extern 方法解决此问题。

常量在同一个编译单元中初始化的顺序就是它们出现的顺序。但是,未定义常量在编译单元之间初始化的顺序。这意味着一个源文件中的 extern 不应依赖于另一个源文件中的 extern

您可以通过以正确的顺序在同一源文件中定义所有常量或使用函数(可能是 inline)返回字符串来解决此问题。

关于c++ - 全局外部人员。字符串和字符之间的区别*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24885376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com