2011-05-05 3 views
0

최근에 Weird undefined symbols of static constants inside a struct/class에 설명 된 문제가 발생하여 모든 정적 const 클래스 멤버에 대한 정의를 해당 .cpp 파일에 추가하여 코드를 준수하도록 노력하고 있습니다. 링커 오류를 일으키는 것들.정적 const 클래스 멤버에 대한 다중 정의 오류

여러 컴파일 단위에서 상수를 사용하는 경우 정의가 하나의 합병 단위에만있는 경우에도 여러 정의 오류가 발생합니다.

이니셜 라이저를 정의로 이동하면 오류를 방지 할 수 있지만 그렇게하지 않을 것입니다.

Visual Studio에서 현재 작업하고있는 동안이 코드는 여러 플랫폼에서 빌드해야합니다.

+6

코드를 보여줄 수 있습니까? – birryree

+1

@ birryree가 말한 것에 덧붙이면 - 귀하의 코드를 귀하의 문제를 증명하는 가장 작은 완전한 예로 줄이십시오. 코드를 줄이면 문제가 발견 될 것이고 (또는 우리에게 필요한 것은 아님) 문제를 쉽게 파악할 수 있습니다 (더 빨리 답변을 얻을 수 있습니다). 짧고 독립적 인 완전한 예제 프로그램은 http://sscce.org를 참조하십시오. –

+0

@birryree 및 @Rob - 코드는 연결된 질문 및 답변과 크게 다르지 않습니다. – IronMensan

답변

1

Visual Studio에서는 언어 확장을 사용하도록 설정 한 경우 구현 파일에서 정의하지 않고 정적 const 개체를 사용할 수 있습니다. 불행히도, 정확한 C++ 프로그램에 대한 에러 (분명히 기억한다면)가있을 것입니다. 명시 적 정의가있을 때입니다.

언어 확장을 사용하지 않도록 설정하십시오.

+0

언어 확장 기능을 사용하지 않으면 Windows7 SDK가 컴파일되지 않으므로 옵션을 사용할 수 없다.그러나 http://msdn.microsoft.com/en-us/library/34h23df8(v=VS.80).aspx에 설명되어있는 selectany 옵션이 트릭을 수행하는 것으로 보입니다. – IronMensan

0

코드가 여러 플랫폼에서 작동하게하려면 초기 설정을 .cpp 파일의 정의로 이동해야한다고 생각합니다. 하나 이상의 컴파일러에서 다르게 작동 할 수도 있지만, 이식하기에 의존하지 마십시오.

3

정적 멤버 변수는 클래스 본문에서 선언되고 클래스 본문 외부에서 한 번 정의됩니다. 이렇게하는 일반적인 방법은 다음과 같습니다.

class MyClass 

{ 
    static int i; 

}; 

int MyClass::i = 0; 

정의는 헤더 (.h)가 아닌 C++ 소스 파일에서 수행됩니다. 이 작업이 완료되면 변수는 헤더 파일이 포함 된 모든 곳에서 정의됩니다. 이 똑같은 문제에 직면 해있는 것 같습니다.

+0

"해당 .cpp"를 포함하여 문제가 아니며 "정의가 하나의 합병 단위에만 있음"이라는 질문에 명확하게 대답하려고 시도했습니다. – IronMensan

1

http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio에있는 게시물 중 하나에 따르면 실제로 시각적 인 스튜디오 버그 일 수 있으므로 초기화 형식을 사용할 수 없습니다.

불행히도 나는 이식성을 유지하기 위해 소스 파일에서 초기화 작업을 수행해야 할 수도 있습니다.

g ++ 4.2에서 컴파일 및 링크 된 간단한 예제를 만들었습니다.

+0

이후 버전의 Visual에서 수정되었는지 압니까? 사진관? 나는 2005 년을 아직도 사용하고있다. – IronMensan

관련 문제