2016-07-06 2 views
1

Visual Studio에서 생성 한 #define이라는 묶음이 있는데 그 값은 제어 할 수 없습니다. 그들은 내가이 #define 모두를 캡슐화하는 지역 (privateconst) 구조를하고 싶은와 내가 작업하고있는 현재의 클래스에서 예컨대#define을 그룹화하는 가장 좋은 방법

CFG_FILT0 
CFG_FILT1 
CFG_FILT2 
CFG_DELTA0 
CFG_DELTA1 
CFG_DELTA2 
... 

, 3 그룹으로 짝. 그런 다음이 클래스의 일부 함수는 이지만 3의 앞에서 설명한 그룹에서만이 값을 읽어야합니다.

for (int idx = 0; chIdx < 3; idx++) 
{ 
    GetItem(myStruct[idx].filt) 
    GetItem(myStruct[idx].delta) 
    ... 
} 

가독성과 메모리 사용의 측면에서 이러한 구조를 정의하는 가장 좋은 방법은 무엇입니까 다음 potentiall 구조 (myStruct)이 같은 허용해야 하는가? 차라리 각 그룹에 대해 하나 하나 명의 구조가 아닌 것

주 3 #define (예를 들어, 위의 예에서 myStructFilt, myStructDelta)

+0

"각 그룹 3 개가 아닌 하나의 구조체를 갖고 싶습니다."그럼 왜 3 개 항목의 배열을 포함하는 구조체를 만들지 않습니까? – Lundin

+3

* 많은 * 특정 사례가 없으면 가장 유용한 목표가 무엇인지, 어떻게 도달 할 수 있는지 추측 할 수 있습니다. –

+0

잠재적 인'GetItem()'의 모든 사용법에 대한 색인의 값은 컴파일시에 알려져 있습니까? 나는. 그것은'GetItem (1), GetItem (10)'처럼 보이거나 변수가 될 것입니까? – Sergio

답변

1

나는 확실히 100 % 아니에요은이는 정말 무엇을 다음 매크로 설명합니다,하지만 당신은 당신에게 유사한 액세스 인터페이스를 얻을 수 있습니다 :

#define GET(kind, idx) (\ 
     (idx) == 0 ? CFG_ ## kind ## 0 \ 
     : (idx) == 1 ? CFG_ ## kind ## 1 \ 
     : (idx) == 2 ? CFG_ ## kind ## 2 \ 
     : -1 /* or you can assert() here*/) 

그리고 사용하는 것은 보이는 같은 :

GET(FILT, 0); 
GET(DELTA, 2); 

물론 이러한 접근법에는 몇 가지 단점이 있습니다. 적어도 복수 계산으로 idx을 생성해야하는데, 생성 된 기계 코드가 불어 나지 만 일부 경우에는 유용 ​​할 수 있습니다.

그리고 인덱스는 상수 경우는

#define GET(kind, idx) CFG_ ## kind ## idx 

이 버전은 전혀 메모리/코드 오버 헤드가 없습니다 더 간단해진다.

+0

C++에서는 매크로를 사용하는 것이 좋지 않습니다. 인라인 함수를 대신 사용해보십시오. – Trantor

+0

@Trantor 네, 매우 우아한 해결책은 아니지만 템플릿이나 인라인 함수로 문제를 해결하려고 할 수 있습니다. 나는 그것이 단순한 매크로보다 쉽지 않을 것이라고 확신한다. – Sergio