我正在尝试使用外部链接
创建名称空间范围常量// 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
}
这甚至可能吗?
答案 0 :(得分:9)
是的,没有;你可以使用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
变量的规则表明you cannot have a declaration that is not also a definition:
[C++11: 7.1.5/9]:
对象声明中使用的constexpr
说明符将对象声明为const
。这样的对象应具有文字类型并应初始化。 [..]
因此,您不能对baz
使用相同的方法。
答案 1 :(得分:0)
constexpr
表示inline
,表示外部链接。因此,您已经有了bar
想要的东西。至于baz
和bing
,您也可以在C ++ 17中内联声明它们。