2010-08-11 5 views
1

내가 헤더 파일에 다음과 같은 경우 :선언 및 헤더에 정적 INT를 초기화

Foo.h

Foo 
{ 
public: 
    static const int BAR = 1234; 
    ... 
}; 

내가 또한 cpp를, 예에서 변수를 정의해야합니까 :

foo.cpp에

const int Foo::BAR; 

우리는 헤더에 정적을 초기화하는 MS의 compil에 작동하는 것 같다 문제가있는 ers하지만 Mac에서 gcc를 사용하면 링커 오류가 발생하는 것 같습니다.

+0

가능한 복제본 [C++ - 클래스 정의의 정적 const 정수 멤버 정의] (http://stackoverflow.com/questions/3025997/c-defining-static-const-integer-members-in-class-definition) – Troubadour

답변

5

당신은 당신이 그들을 쓴 것처럼 선언과 정의가 모두 필요합니다.

정수이기 때문에 선언에서 초기화 할 수 있으며 컴파일러는 가능한 경우 컴파일 타임 상수로 처리해야합니다. 그러나 여전히 소스 파일에서 하나의 정의 만 필요하거나 상수로 처리 할 수없는 링크 오류가 발생합니다.

분명히 Microsoft는 표준 동작이 너무 혼란스럽고, 이니셜 라이저를 정의로 사용하여 선언을 처리하기 위해 언어를 "확장"했습니다. this issue을 참조하십시오. 결과적으로 기호를 올바르게 정의하면 링크 오류 (다중 정의 기호)가 발생합니다. 언어 확장을 비활성화하여 표준 동작을 얻을 수 있습니다 (/Za).

+0

두 번째 (.cpp) 하나 다음 내 응용 프로그램은 MSC에서 연결되지 않으며 '하나 이상의 다중 정의 된 기호가 발견되었습니다'. 머리글에 정적을 초기화하지 않으면 연결됩니다. – Rob

+0

@Rob : MSC가 잘못되었습니다. 내 대답을 업데이트. –

0

선언은 헤더에서 수행해야하며, 초기화 정적 멤버 변수 here에 대한 흥미로운 기사가 ​​년대 .CPP

에 수행해야합니다.

1

첫 번째 조각은 일부 환경에서는 작동하지만 실제로 일부 컴파일러에서는 정의가 필요하며 상수 주소를 사용하는 경우에는 물론 필요합니다.

class A 
{ 
    public: 
     enum { someconstant=1234 }; 
}; 

가 필요없이 일정한 컴파일 시간으로 사용할 수 someconstant한다 : 당신이 일정을 소개하는 헤더와 본문을 터치해야하는 마음에 들지 않으면

는 여전히 이전 열거 트릭이있다 몸의 정의.

+3

컴파일 타임 상수로 항상 취급되는 경우 첫 번째 단편만으로도 작동 할 수 있습니다. 그러나 그것은 선언이 아니라 정의이며, 정의를 빠뜨리는 것은 오류입니다. 참조 나 포인터를 사용하려고 시도하거나 어떤 이유로 컴파일러가 컴파일 타임 상수로 취급하지 않으면 링크 오류가 발생합니다. –

+0

마이크를 지적 해 주셔서 고마워요. 정적 const int 정의에 관한 수정 된. –

0

헤더 파일

Foo 
{ 
public: 
    static const int BAR; 
    ... 
}; 

코드 파일

const int Foo::BAR = 1234; 
+0

정수 상수 정적 멤버는 클래스 정의에서 선언 된 위치에서 초기화 될 수 있습니다. 가능한 한 컴파일 타임 상수로 처리 할 수 ​​있도록하는 것이 좋습니다. –