我有这样的情况:

// 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 再次。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top