2014-02-27 2 views
0

변경할 필요가없는 id_vector이라는 정수 벡터의 초기화에 문제가 있습니다.다른 플랫폼에 대해 하드 코드 된 int의 벡터 초기화

이니셜 라이저는 다음과 같이 수행됩니다

static int id[4]{200,300,400,500}; 
id_vector = std::vector<int> (id,id + (sizeof(id)/sizeof(int))); 

를 지금까지 너무 좋아. 하지만 이제는이 소프트웨어의 다른 버전이 있어야하며 버전에 따라 다른 ID 배열을 선택하고 싶습니다. 내가 생각할 수있는 유일한 방법은 #ifdef 또는 일종의 매크로를 사용하는 것입니다.하지만 누군가가 더 나은 방법을 알고 있는지 궁금합니다. 네임 스페이스와 같은 것을 생각하고 있었지만 이것이 좋은 사용법인지는 모르겠습니다.

UPDATE는 미안 코드에서 오타를했다. 미안 내가 분명히하지 않았지만 기본적으로 이것은 유효한 ID 목록이며 다른 유효한 ID가 필요한 두 가지 버전이 있습니다. 더 많은 코드를 추가 할 필요가 있다고 생각하지 마십시오. 당신이 다른 플랫폼에 대해 서로 다른 값을 넣어해야하고, 당신이 코드에서 일어나는 변화를해야하는 경우

+0

바람직하지 않음) 또는 포함 된 라이브러리/설정 등에서 다를 수 있습니까? 네임 스페이스를 사용할 수는 있지만 전처리기를 사용하여 참조되거나 포함 된 네임 스페이스를 전환해야합니다. config에서 실행 시간 값을 가져올 수 있습니다. ifdefs와 매크로가 가능하다. 빌드 시스템의 일부에서 링크 할 os 특정 오브젝트를 지정할 수 있습니다. –

+0

@dasblinkenlight가 오타를 수정했습니다. –

+0

@TonyD 더 많은 코드를 포함하고 싶었지만 근본적으로 유효한 정수 값이기 때문에 특정 문제에 대한 자세한 사양이 다른 사람들에게는 도움이되지 않을 것이라고 생각했기 때문에 일반 코드로 유지하려고했습니다. –

답변

1

네임 스페이스가 필요합니까? g++ -DUSE_PLATFORM=PLATFORM_A ... 또는 g++ -DUSE_PLATFORM=PLATFORM_B ... 또는 그러나으로

namespace PLATFORM_A 
{ 
    static int id[4]{200,300,400,500}; 
} 

namespace PLATFORM_B 
{ 
    static int id[4]{500,400,300,200}; 
} 

using namespace USE_PLATFORM; 

... 

id_vector = std::vector<int> (id,id + (sizeof(id)/sizeof(int))); 

당신 설정 USE_PLATFORM .... 우리는 서로 다른 버전이 이미 다른 실행 이미지가 있는지 여부 (및 그 바람직한 여부 또는 빌드 환경에 대해 아무것도 모른 채 말할 수있는 방법

+0

이것은 내가 원한 것에 더 가깝습니다. 그러나 나는 또한 그것이 조금 덜 명백한 것으로 생각했다. –

0
std::vector<int> id_vector (id,id + (sizeof(id)/sizeof(int))); 
0
id_vector = std::vector<int> (id, id + (sizeof(id)/sizeof(*id))); 
2

당신의 #ifdef로 끝날 것입니다 (말하자면, 구성 파일이 반대로) 당신의 암호. 여기 당신이 그것을 할 수있는 방법의 한 예는 다음과 같습니다

static int id[4]{ 
#ifdef PLEFTORM_1 
200,300,400,500 
#endif 
#ifdef PLEFTORM_2 
100,200,410,522 
#endif 
}; 
id_vector = std::vector<int> (id,id + (sizeof(id)/sizeof(*id))); 

또 다른 해결책은 별도의 파일에 모든 플랫폼에 따라 물건을 넣어 조건부로 해당 파일을 포함 할 수있다. 이렇게하면 #ifdef 수가 1로 줄어들 수 있지만 전체 코드가 더 읽기 어려울 수 있습니다.

물론 전략을 변경하고 플랫폼 별 ID를 구성 파일에 배치 할 수 있습니다. 이렇게하면 조건부 컴파일을 피할 수 있으며 구성 파일에 런타임 종속성이 적용됩니다.

+0

이것이 내가 피하려고했던 것입니다 ... 그러나 나는이 간단한 것이 아마도 갈 길이라고 생각합니다. –