// a.cpp
const std::string STR_A = "abcd";
// b.cpp
B g_b;
B::B()
{
std::cout << "B::B()" << std::endl;
std::cout << "a : " << STR_A.c_str() << std::endl;
v = STR_A;
}
void B::testFunc()
{
std::cout << "B::testFunc()" << std::endl;
std::cout << "v : " << v << std::endl;
}
// main.cpp
int main()
{
g_b.testFunc();
}
a.cpp : STR_A 라는 글로벌 변수가 있다.
b.cpp : g_b 라는 글로벌 변수가 있는데 STR_A 를 사용한다.
main.cpp : main 에서 g_b 를 사용한다.
$ g++ -c a.cpp b.cpp c.cpp
$ g++ a.o b.o c.o
$ ./a.out
B::B()
a : abcd
B::testFunc()
v : abcd
컴파일하고 링크했을 때 g_b 가 잘 초기화된 걸로 보인다.
$ g++ b.o a.o c.o
$ ./a.out
B::B()
a :
하지만 오브젝트 파일 순서를 바꿔서 링크하면 main 호출 전에 crash 가 발생한다. STR_A 가 초기화 되기 전에 g_b 가 사용하려고 해서 access violation 이 발생한 것 같다.
g++ 은 입력된 object 순서대로 link 된 것 같은데 컴파일러마다 순서가 다를 수도 있으니 주의하자.
참고 : https://isocpp.org/wiki/faq/ctors#static-init-order
728x90