如何使用外部链接在命名空间范围内定义常量双精度

How to define a constant double at namespace scope with external linkage?

本文关键字:范围内 定义 常量 双精度 命名空间 何使用 外部 链接      更新时间:2023-10-16

我正在尝试创建一个带有外部链接命名空间范围常量

// in some include file:
namespace foo 
{
    constexpr double bar() { return 1.23456; } // internal linkage
    constexpr double baz = 1.23456;            // internal linkage
    const double bing = 1.23456;               // internal linkage
}

这可能吗?

是,也不是;您可以使用extern

[C++11: 3.5/3]: 具有命名空间范围 (3.3.6) 的名称具有内部链接,如果它是

  • 显式声明static的变量、函数或函数模板;或者,
  • 明确声明constconstexpr的变量,既未明确声明extern,也未声明具有外部链接;或
  • 匿名工会的数据成员。

所以:

namespace foo 
{
    extern constexpr double bar() { return 1.23456; }
    extern constexpr double baz = 1.23456;
}

在另一个翻译单元中,您现在应该能够声明函数的名称并引用它:

#include <iostream>
namespace foo
{
   extern constexpr double bar();
}
int main()
{
   std::cout << foo::bar() << 'n';
}

但是,constexpr变量的规则规定,不能有一个不是定义的声明:

[C++11: 7.1.5/9]: 对象声明中使用的constexpr说明符将对象声明为 const 。此类对象应具有文本类型,并应进行初始化。[..]

因此,您不能对baz采取相同的方法。

函数

constexpr意味着inline,这意味着外部链接。所以你已经有了你想要的bar.至于 bazbing ,您也可以在 C++17 中内联声明它们。

另请参阅 https://stackoverflow.com/a/4193698/261217