// 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

 

Standard C++

 

isocpp.org

 

728x90

+ Recent posts