2009-08-25 2 views
8

VC++에서 클래스 멤버 변수에 대한 배열 바인딩을 지정해야 할 때 다음과 같이하면됩니다.모든 C++ 컴파일러는 static const int 클래스 멤버 변수를 배열 바인딩으로 사용할 수 있습니까?

 class Class { 

private: 
    static const int numberOfColors = 16; 
    COLORREF colors[numberOfColors]; 
}; 

(제발 std :: vector 사용에 대해 말하지 마십시오.)

이 방법은 배열 상수 및 나중에 루프 문 제약 조건을 지정하는 클래스 코드로 사용할 수있는 상수가 있고 동시에 다른 곳에서는 볼 수 없습니다.

문제는 VC++에서만 허용되는 static const int 멤버 변수의 사용 여부 또는 일반적으로 다른 널리 사용되는 컴파일러에서 허용되는 것입니까?

+8

은 "표준을 사용하여 : 벡터를 여기에 대해 말하지 말아주세요"- 아니, 적절하지 않을 것이라고. 'std :: tr1 :: array'을 사용해야합니다. ':)' – sbi

답변

4

네, 100 % 합법적 휴대해야한다. C++ 표준은 5.19이 말한다 - 상수 표현 "(강조 광산) : 배열 범위 (8.3.4, 5.3.4)와 같은 : 여러 장소에서

, C++는 필수 또는 열거 형 상수로 평가 표현을 필요로 , 비트 필드 길이 (9.6), 열거 자 이니셜 라이저 (7.2), 정적 멤버 초기화 프로그램 (9.4.2) 및 정수 또는 열거 형 비 템플릿 템플릿 인수 (14.3)와 같은 대/소문자 표현식 (6.4.2) .

constant-expression: 
    conditional-expression 

불가분의 일정한 표현이로 초기화 만 리터 (2.13), 열거, CONST 변수 또는 일체의 정적 데이터 멤버 또는 열거 타입을 포함 할 수있다 상수 식 (8.5), 정수 또는 열거 형의 비 형식 템플릿 매개 변수 및 sizeof 식입니다.

는 VC6를 지원하지 않는 것 같습니다, 말했다. 좋은 해결 방법은 StackedCrooked's answer을 참조하십시오. 실제로, 나는 일반적으로 enum 메소드를 선호합니다.이 유형의 것에 대한 StackedCrooked 주석이 있습니다.

FYI의 "static const"기술은 VC9, GCC 3.4.5 (MinGW), Comeau 및 Digital Mars에서 작동합니다.

그리고 당신은 "`const 정적 '"멤버를 사용하는 경우, 당신은 need a definition for it in addition to the declaration 엄밀히 말하면 것 잊지 마세요. 그러나 사실상 모든 컴파일러는이 경우 정의를 건너 뛰는 것을 허용합니다.

1

저는 몇 년 전에 이식성에 대해 걱정하지 않았습니다. 아마도 아직 그것을 지원하지 않는 컴파일러가 있을지 모르지만 나는 최근에 그 중 어떤 것도 만난 적이 없다.

13

해당 동작은 C++ 표준에 따라 유효합니다. 최근의 모든 컴파일러 을 지원해야합니다.

6

이 지금 10 년 이상 ++ 표준 C를하고있다. 벤처 캐피탈 (VC)도 지원합니다 - 원하는 게 더 많을까요? (@Neil : 무엇에 대해 SunCC :^>)

6

그 비주얼 스튜디오 2005을 믿고 이상을 지원합니다. XCode C++ 컴파일러 (실제로 gcc).

당신이 안전하려면 당신은 항상 내가 ++ 효과적인 C에서 배운 이전 열거 해킹을 사용할 수 있습니다. 그것은 이렇게 가고 :이 도움이

class Class { 

private: 
    enum { 
     numberOfColors = 16 
    }; 
    COLORREF colors[numberOfColors]; 
}; 

희망을.

+0

VS 2k3도 지원합니다. – sharptooth

+0

열거 형은 C++ 코드를 처리하는 경우 필요는 없습니다 '해킹',하지만 당신이 원한다면 선언이 C 나 VC++ 6 일,이에 #DEFINE를 사용하는 일반적인 방법보다 낫다 내 의견. –

2

나는이 또한 GCC 및 Solaris에 맞는지 확신 해요,하지만 난 그 순간에이를 확인할 수 없습니다.

template<int size> 
class Class { 
private: 
    COLORREF colors[size]; 
}; 

과 같이 사용 :

는 앞으로이 같은 생각을 확장 할 수

Class<5> c; 

을 그래서 당신은 응용 프로그램에서 정확히 하나 개의 버퍼 크기로 제한되지 않습니다.

+0

당신은 질문에서 피하려고했던 마법 번호를 사용하고 있습니다. –

+0

@Neil : 그러나 위의 매직 넘버 5는 'c'가 그 자체의 멤버가 될 수도있는 클래스의 static const int로 대체 될 수 있습니다. – quamrana

-1

ISO C++ speicifcation를 참조하여이 같은 질문에 대답 할 수 있지만 사람들이 얻을 읽기 어려워하는 사양은 어렵다. 가장 단순한 대답은 두 가지에 달려 있다고 생각합니다.

  • Microsoft Visual Studio 2005 이상은 비교적 규격에 맞는 C++ 구현입니다. 그것이 당신이 무언가를하는 것을 허용하는 경우에, 기회는 그것의 기준이다.
  • GCC 컴파일러를 사용하여 코드를 시험해 보려면 Code :: Blocks와 같은 것을 다운로드하십시오. 그것이 MS와 GCC에서 작동한다면, 기회는 실제로 그것의 표준입니다.
+0

사양은 ($ 30) 얻을 매우 쉽습니다 : http://stackoverflow.com/questions/81656/where-do-i-find-the-current-x-standard/83763#83763는 사양을 읽는 것은 다른 것입니다 이야기는하지만 심각한 C++ prgrammers 아마 아직도 때때로 그것을 참조해야합니다 http://stackoverflow.com/questions/1123455/should-every-c-programmer-read-the-iso-standard-to-become-professional –

13

이것은 유효한 C++이며 대부분의 (모든?) 최신 컴파일러가 지원합니다.당신이 부스트를 사용하는 경우, 당신은 BOOST_STATIC_CONSTANT 매크로의 형태로이 기능을 휴대 지원을받을 수 있습니다

class Class { 
private: 
    BOOST_STATIC_CONSTANT(int, numberOfColors = 16); 
    COLORREF colors[numberOfColors]; 
}; 

컴파일러가이를 지원하는 경우 매크로 static const int numberOfColors = 16에 확장을, 그렇지 않으면 enum { numberOfColors=16 };에 의지한다.

3

정적으로 alocated 배열의 요소 수를 확인 할 기능에 따라 사용할 수있는 다른 답변 게다가 :

template<typename T, size_t length> 
size_t arrayLength(T (&a)[length]) 
{ 
    return length; 
} 
관련 문제