質問

私はこうした状況:

// 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 各社とも連携(デフォルトのための定数の定義)?

私が書き換えます。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 ();

すべての作品。

と思ったものをオリジナルの状況が自動inliningのクラス内で検core.cppうTest.cpp はしていない既存のコードはcore.cppすべての作品。もえたデータセンターとしての可能性を展望するとともに変更は行ます。h?

役に立ちましたか?

解決

Const定義の内部リンケージに関する仮定は必ずしも真実ではありません。 SUNDARTセクション3.5 Program linkage、p。 3(N3690を引用しています):

ネームスペーススコープ(3.3.6)を持つ名前

の名前である場合は内部リンケージを持っています。

  • 明示的に静的に宣言されている変数、関数、または関数テンプレート。または

  • constまたはconstexprを明示的に宣言し、外部リンケージを持つために以前に宣言されたextern nor を明示的に宣言していない不揮発変数。または

  • 匿名ユニオンのデータメンバー。

だからparamには外部のリンケージがあり、すべてが問題ありません。

2番目の場合は、Core.cppに内部リンクparamがありますが、外部リンケージがあるが定義がない別の宣言された唯一のparamがあります。

3番目のケースでは、再びparamが1つあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top