これについて多くの質問がありましたが、この特定のユースケースのコードをコンパイルする方法についての説明はありません。私は次のコマンドを実行します:g++ main.cpp c.cpp testobj.cpp -o main
、これを実行して私にSegmentation fault (core dumped)
を与えます。 main
メソッドのprintステートメントをmain.cpp
にして、すべてTestObj
コードを削除すると機能します。名前空間内のC++グローバル変数
これは、C::test
を割り当てる定数ですか?
main.cppに:
#include "c.h"
#include "testobj.h"
TestObj testobj;
int main() {
return 0;
}
c.h:
#ifndef CONSTANTS
#define CONSTANTS
#include <string>
namespace C {
extern std::string test;
}
#endif
c.cpp:
#include "c.h"
namespace C {
std::string test = "test";
}
試験obj.h:
#ifndef TESTOBJ
#define TESTOBJ
class TestObj {
public:
TestObj();
};
#endif
testobj.cpp:
#include "testobj.h"
#include <iostream>
#include "c.h"
TestObj::TestObj() {
std::cout << C::test << std::endl;
}
'TestObj testobj'の宣言を' TestObj * testobj'に変更し、 '* testobj = TestObj()'を実行して初期化を 'main()'メソッドに移動しますか? – martijnn2008
@ martijnn2008はい、安全なポインタの使用を検討している場合。 :) 'main'関数は、すべてのグローバル変数が初期化された後に常に呼び出されます。 –