gpt4 book ai didi

c++ - 非整数常数

转载 作者:IT老高 更新时间:2023-10-28 22:16:17 26 4
gpt4 key购买 nike

我想要一个包含非整数常量的头文件,例如一类。请注意,该常量不需要必须是编译时常量。

static const std::string Ten = "10";

这可以编译,但不受欢迎,因为每个编译单元现在都有自己的 Ten 拷贝。

const std::string Ten = "10";

这将编译,但会因多重定义的十的链接器错误而失败。

constexpr std::string Ten = "10"s;

这会起作用,但前提是字符串构造函数也是 constexpr。会的,但我不能指望每个非整数常量都有一个 constexpr 构造函数……或者我可以吗?

extern const std::string Ten = "10";

这似乎可行,但我担心如果我误以为会出现链接器错误。

inline const std::string Ten( ) { return "10"; }

除了简洁的语法外,它拥有我想要的一切。另外,现在我必须将常量称为函数调用,Ten()

inline const std::string = "10";

这似乎是理想的解决方案。当然,标准不允许 inline 变量。

  • c++ 标准中是否有说明 extern 版本应该可以工作,还是我很幸运它可以与 GCC 一起工作?
  • 是否有令人信服的理由不允许内联变量?
  • c++03 有没有更好的方法,还是 c++0x 有更好的方法?

最佳答案

你好像把它们弄混了。

你说得对

static const std::string Ten = "10"; 

版本。它会“工作”,但会在每个翻译单元中创建一个单独的对象。

不带static的版本也是一样的效果。它不会产生链接器错误,但会在每个翻译单元中定义一个单独的对象。在 C++ 语言中,const 对象默认具有内部链接,这意味着

const std::string Ten = "10"; // `static` is optional

完全等同于带有 static 的先前版本。

带有extern和初始化器的版本

extern const std::string Ten = "10"; // it's a definition!

将产生一个具有外部链接的对象的定义(这是一个定义,因为存在初始化程序)。 这个版本将导致链接器错误,因为您最终会得到一个具有外部链接的对象的多个定义 - 违反 ODR。

您可以这样做:

为了实现你想要达到的目标,你必须在头文件中声明你的常量

extern const std::string Ten; // non-defining declaration

然后在一个且只有一个实现文件中定义它(使用初始化器)

extern const std::string Ten = "10"; // definition, `extern` optional

(如果常量被预先声明为 extern,那么定义中的 extern 是可选的。即使没有明确的 extern 它也会定义一个带有外部链接的 const 对象。)

关于c++ - 非整数常数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2151831/

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