如何使用外部链接在命名空间范围内定义常量双精度
How to define a constant double at namespace scope with external linkage?
我正在尝试创建一个带有外部链接的命名空间范围常量
// 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
的变量、函数或函数模板;或者,- 明确声明
const
或constexpr
的变量,既未明确声明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
.至于 baz
和 bing
,您也可以在 C++17 中内联声明它们。
另请参阅 https://stackoverflow.com/a/4193698/261217
相关文章:
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- 为什么我可以在较小的范围内重新定义常量
- 尝试和捕获中的对象声明未在范围内定义
- 使结构内定义的枚举具有全局范围C++
- 如何在类范围内定义/专门化type_trait
- "stoi"没有在此范围内声明,即使添加 -std=c++0x 和自定义函数,仍然适用
- 全局定义和范围内定义的区别
- 如果左值不再在其定义范围内使用,编译器是否允许将左值转换为右值引用
- 为什么我不能在 C++ 中在全局范围内单独声明和定义变量
- 在本地范围内重新定义typedef
- 定义要在全局范围内运行而不发出警告的宏
- 为什么在未命名的命名空间中声明变量后无法在全局范围内定义变量?
- 为什么不允许将类成员定义的' static '关键字放在命名空间范围内?
- 可以定义在系统范围内使用的自定义URI方案
- 为所有游标id在系统范围内设置自定义游标
- ISO C++03对在函数范围内定义的结构有什么限制
- 在嵌套类的封闭类范围内定义成员函数
- 'memcpy'未在此范围内定义
- 如何使用外部链接在命名空间范围内定义常量双精度