2009-03-13 9 views
10

나는 게임을하고 흥미로운 질문을하고있다. 하나의 파일에 구현하려는 게임 전체 상수 값이 있습니다.크로스 파일 상수를 정의하는 C++ 최선의 방법

extern const int BEGINNING_HEALTH = 10; 
extern const int BEGINNING_MANA = 5; 

constants.hpp

extern const int BEGINNING_HEALTH; 
extern const int BEGINNING_MANA; 

그리고 파일을 그냥 #include를

constants.cpp "constants.hpp"이것은 위대한 일하는 년까지 : 지금은 이런 일이 외부 연결 상수가 유효한 템플릿 매개 변수가 아니기 때문에 하나의 상수를 템플릿 매개 변수로 사용해야했습니다. 내 질문에, 이러한 상수를 구현하는 가장 좋은 방법은 무엇입니까? 머리글 파일에 상수를 두는 것만으로 각 번역 단위에 상수가 정의 될 것입니다. 매크로를 사용하고 싶지 않습니다.

감사합니다.

답변

19

extern을 제거하면 설정됩니다.

모든 따라서 "진정한 상수"이고 때문에이 코드는, 헤더에 완벽하게 잘 작동

내부 연결이 있습니다

const int BEGINNING_HEALTH = 10; 
const int BEGINNING_MANA = 5; 
const char BEGINNING_NAME[] = "Fred"; 
const char *const BEGINNING_NAME2 = "Barney"; 

이 코드는 안전하게 헤더 파일에 넣을 수없는 각 행은 외부 링크를 (이 있기 때문에 명시 적으로 또는) 진정 일정 없다는 때문에 :

extern const int BEGINNING_HEALTH = 10; 
extern const int BEGINNING_MANA = 5; 
const char *BEGINNING_NAME = "Wilma"; // the characters are const, but the pointer isn't 
+0

마지막 BEGINNING_NAME [] 1에 복사/붙여 넣기 버그가 의심됩니다. BEGINNING_NAME (으)로 쓰시겠습니까? –

+0

당신이 정확하고 고정되어 있습니다. 감사. – Tom

+0

"정적"이 필요합니다. 그렇지 않으면 내부 연결이나 더 이상적으로 인라인 된 값이있는 "#define"과 동등합니다. –

10

열거 형은 어떻습니까? 정적 클래스의 라인을 따라

constants.hpp

enum { 
    BEGINNING_HEALTH = 10, 
    BEGINNING_MANA = 5 
    } 
-2

아마도 뭔가?

class CONSTANTS { 
public: 
static inline int getMana() { return 10;}; 
}; 
+0

그건 도움이되지 않습니다. 함수 값은 템플릿 매개 변수로 사용할 수 없습니다. C++ 0x 키워드 인'constexpr'은 그 문제를 해결하기로되어 있습니다. 게다가 C++에는 "네임 스페이스"상수에 대한 정적 클래스에 수퍼바이저 인 네임 스페이스가 있습니다. – Tom

+0

* superior * ... 기본 교정 기술이 부족합니다. – Tom

0

대부분의 컴파일러는 단순히 const를 POD 값에 대한 공간을 할당하지 않습니다. 그들은 그들을 최적화하고 마치 #define d 인 것처럼 치료합니다. 그렇지 않습니까?

+0

닫기, 그래도 여전히 똑같은 것은 아닙니다. 매크로가 작동하지만 상수가 작동하지 않는 예 : #define FOO "foo"; \ const char * str = "bar"FOO; C 및 C++에서는 문자열 리터럴 토큰을 연결할 수 있지만 문자열 상수는 연결할 수 없습니다. – Tom

+0

이것은 정수 상수에만 해당됩니다. 최적화가 비활성화되면 float, double, char * 및 기타 유형은 저장소에 할당됩니다. –

+0

@ 톰 : 그건 내가 의미했던 것이 아닙니다. 나는 전처리 기가 아닌 POD 상수를 의미했습니다. 나는 그 의미에서 기호와 그 값을위한 공간이 당신이 그것의 주소를 취하지 않으면 존재하지 않는다는 것을 의미했습니다. – greyfade

-5

제목 질문에 대한 빠른 대답으로, 파일 간 (cross-file) 상수를 정의하고 객체 인스턴스 하나만을 보증하는 싱글 톤 패턴이 가능한 최고의 C++ 방법입니다.

템플릿 매개 변수 문제는 값이 아닌 형식을 전달해야합니다. 귀하의 유형은 "int"입니다.

+0

이것은 단순한 상수 집합에 대한 과도한 것처럼 보이며 템플릿 인스턴스화로 문제를 해결할 가능성이 없습니다. – Eclipse

+0

왜 외부 인스턴스가 아니기 때문에 템플릿 인스턴스화로 문제를 해결하지 못하면 로컬이됩니다. 잔인 함은 상대적입니다. 품질 측면에서 1 억 달러, 100,000 달러 또는 100 달러의 게임 예산은 무엇입니까? – jeffD

+0

jeffD, 문제는 당신의 대답이 이치에 맞지 않는다는 것입니다. "int"를 싱글 톤으로 만들고 싶습니까? int는 신원이 아닌 값으로 구성됩니다. 아마 사람들이 당신을 하향 화하게 만들었던 또 다른 것은 그가 타입을 전달하기를 원하지 않는다는 것입니다. 그러나 그의 템플릿에 값을 전달합니다. 왜 그럴 수 없다고하니? –

6

.hpp 파일에서 "static const int"를 사용하고 .cpp 파일에 아무 것도 넣지 마십시오 (당연히 그 밖의 다른 코드는 제외). 지금까지 간단한에 무슨 일이 있었는지

0

:

#define BEGINNING_HEALTH 10 

남자는, 그는 일이었다.
잠깐만, 그 은 여전히 ​​ 일입니다! 네임 스페이스의

+0

그게 당신이 템플릿 매개 변수의 맥락에서 기대하고있는 일을하지 않을 수도 있습니다 ... :) rlbond가 필요합니다. –

+4

일부 사용자는 디버거가 '10'대신 'BEGINNING_HEALTH'을 (를) 표시하도록합니다. –

+0

printf()를 사용할 때 디버거가 필요할 때가 있습니까? slacy

3

메이크업 사용 :

namespace GameBeginning { 
    const int HEALTH = 10; 
    const int MANA = 5; 
}; 

다음 유 플레이어로 사용할 수 있습니다.health = GameBeginning :: HEALTH;