2011-01-18 6 views
0

개체를 보유하는 변수를 포함하는 코드를 디버깅하는 데 어려움을 겪고 있습니다. 그 가치는 유지되지 않습니다. 이와 같이,참조하지 않는 변수의 값을 유지하는 g ++ 옵션

//foo.cpp 
CCustomClass cfoo = CStaticClass::cfoo_static; // cfoo_static is a static member object 

void footest() 
{ 
    // code here that use cfoo but cfoo is empty 
} 

//main.cpp 
int main() 
{ 
    footest(); 
    return 0; 
} 

cfoo는 foo.cpp의 글로벌 기능입니다. 전역 변수 cfoo의 값을 유지하는 g ++ 옵션이 있는지 궁금합니다.

또한,이 같은 기준을 유지하기 위해 cfoo을 변경하면 응용 프로그램이 작동합니다

//foo.cpp 
CCustomClass& cfoo = CStaticClass::cfoo_static; // cfoo_static is a static member object 

을 양지하지만 첫 번째 예제를 사용하려면하시기 바랍니다.

상담하십시오. 감사.

+0

또 다른 질문은 영어보다 C++보다 더 나은 설명입니다. –

답변

2

static initialization order fiasco이 발생한 것 같습니다. construct on first use idiom으로 해결할 수 있습니다. 함수를 처음 호출 할 때 값을 초기화하는 함수에 cfoo 줄 바꿈. 그렇게하면 필요할 때 초기화 할 수 있습니다. 지금은 초기화되기 전에 cfoo_static의 값을 얻게됩니다.

+0

감사합니다. 그러나 함수를 사용하지 않고 "처음 사용 관용구를 구성하는"다른 방법이 있습니까? 사실 코드는 gcc 컴파일러를 사용하는 다른 플랫폼에서 잘 작동합니다. 그러나 g ++을 사용하여 다른 플랫폼으로 이식하면 문제가 발생합니다. 그래서이 문제를 해결할 수있는 컴파일러 옵션이 있는지 궁금합니다. – domlao

+0

아니요, 없습니다. 정적 초기화 순서가 다르고 작동하기 때문에 다른 플랫폼에서 작동합니다. –

+2

기사에서 "당신은 죽을 확률이 50 % -50 %"라고 말합니다. 어쩌면 그것이 다른 플랫폼에서 작동한다는 것은 운의 문제 일 수 있습니다. 코드가 실제로는 아닐 때 코드가 좋은 것처럼 보이기 때문에 불운이 일어납니다. – nobar

1
//foo.cpp 
CCustomClass cfoo = CStaticClass::cfoo_static; 

CStaticClass::cfoo_static은 어디에서 초기화 했습니까? 다른 .cpp에?

cfoo 전에 foo.cpp에 동일한 파일에 초기화 마십시오. 이런 식으로 뭔가 : 당신이, 당신은뿐만 아니라 cfoo을 초기화하기 위해 동일한를 사용할 수와 cfoo_static를 초기화 어떤 값 방식, 왜 대신 cfoo_static에 따라 cfoo을 만드는, 그것을하지 않는으로

CCustomClass CStaticClass::cfoo_static = //initialization code! 
//foo.cpp 
CCustomClass cfoo = CStaticClass::cfoo_static; 

?


일 당신이 당신의 코드가 CStaticClass::cfoo_static를 포함 변경할 수없는 경우, 어쩌면이 당신에게 유용 할 수 있습니다 :

//foo.cpp 
CCustomClass& cfoo() //a function with name cfoo!! 
{ 
    static CCustomClass foo =CStaticClass::cfoo_static; 
    return foo; 
} 

void footest() 
{ 
    //use cfoo() function! 

    cfoo().DoWork(); //an example 
} 

+0

>> 어디에서 CStaticClass :: cfoo_static을 초기화 했습니까? 다른 .cpp에? 예, 다른 파일에 실제로 사용할 공용 헤더. 감사합니다. – domlao

1

이 글로벌 데이터의 초기화의 순서과 관련이있다 . cfoo_static이 cfoo에 할당되기 전에 초기화 된 것으로 가정 할 수 없습니다.

가장 좋은 방법은 글로벌 데이터의 과도한 사용을 피하는 것입니다.

이 문제를 해결할 수있는 한 가지 방법은 함수 중 하나에서 할당을 수행하는 것입니다.

+0

나에게 너무 나쁘다. 실제 코드를 변경하는 옵션이 없다. 감사합니다. – domlao

+1

코드를 변경할 수 있습니까? 아니면 컴파일러 옵션으로이 문제를 해결할 방법을 찾고 있습니까? – nobar

+0

그래,이 문제를 해결할 컴파일러 옵션이 있기를 바랍니다. 감사합니다 – domlao

1
당신이 싱글 종로의 귀갑를 사용하고 같은 것을 수행 할 수 있습니다

:

CcustomClass* getFoo(void) { 
    static CcustomClass* cfoo = null; 
    if (cfoo == null) { 
     cfoo = new CcustomClass(); 
    } 
    return cfoo; 
} 

을 다음 getFoo에게 당신이 그것을 사용할 때마다 호출합니다.

+0

이것은 싱글 톤이 아닙니다. 그러나 이것은 "처음 사용시 구성"관용구의 한 형태입니다. 그것이 옳은 대답입니다. –

1

문제를 해결할 컴파일러 옵션이 없다고 생각합니다. 문제는 코드 자체에 undefined behavior입니다.

그러나 파일이 링크 된 순서 (즉, )를 다시 지정하여 특정 플랫폼에서 작동하게 할 수도 있지만이 파일의 크기는입니다.

관련 문제