クラス用グローバルextern定数の変数定義される社内連携
-
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 各社とも連携(デフォルトのための定数の定義)?
私が書き換えます。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つあります。
所属していません StackOverflow