类使用全球外部const变量的定义是内部的联系
-
26-12-2019 - |
题
我有这样的情况:
// Test.h
extern const int param;
class Test
{
private:
int i;
public:
int foo();
};
和
// Test.cpp
#include "Test.h"
int Test::foo() { return param*10; }
和
// core.h
#include "Test.h"
const int param = 1; // should have internal linkage later in core.cpp
int do_stuff ();
和
// core.cpp
#include "core.h"
int do_stuff () { Test obj; return obj.foo(); }
int main() { return do_stuff(); }
然而,没有连接的错误。如何不会接头看看Test.cpp 的 const int param
这是通过核心。h定义core.cpp 具有内在的联系(默认const定义)?
当我重写核心。h这样的(变化的两条线):
// core.h
const int param = 1;
#include "Test.h"
int do_stuff ();
有一个接头的错误缺少的 param
.然后,当时我改变它是这样的:
// core.h
extern const int param = 1;
#include "Test.h"
int do_stuff ();
所有工作。
我想,这也许在原来的情况有一个自动内联类测试的内部core.cpp,因此,Test.cpp 是不存在的和整体的代码中core.cpp,因此,所有工作。但是为什么它那么可以依赖的变化的两条路线在核心。h?
解决方案
你假设有关的内部联系const的定义是不总是正确的。看到标准部分 3.5 Program linkage
,p.3(我引用N3690):
一名有名字空间范围(3.3.6)具有内在的联系,如果它的名字
一个变量、功能或功能的模板,这是明确地宣布静态的;或者,
非挥发性可变的,是明确地宣布const或常量表达式和既没有明确宣布的外部,也不是 以前声明的有外部的联系;或
数据成员的一个匿名的联盟。
因此,对于第一种情况下 param
有外部的联系,一切都是好的。
对于第二种情况下,有一个内部联 param
在core.cpp但还有另外一个声明-只有 param
具有外部的联系,但没有定义。
在第三种情况下,有一个 param
再次。
不隶属于 StackOverflow