2017-11-24 29 views
2

일부 지오메트리 기반 코드로 작업하고 있습니다. 현재 진행중인 작업에는 견고한 표본을 포함하기위한 경계 상자의 사용이 포함됩니다. 이제 코드에서 두 개의 다른 유형, 즉 INNER_BOUNDING_BOXOUTER_BOUNDING_BOX을 고안했습니다. 코드는 두 상자 중 하나의 사용을 기대하지만 둘 다 사용하지는 않습니다. 나는 전처리기를 사용하여 그것을 달성하려고 노력하고있다. 두 매크로, 즉 USE_INNER_BOUNDING_BOXUSE_OUTER_BOUNDING_BOX을 기반으로 추가 코드를 작성했습니다. 나는 언제든지 하나의 매크로는 다음과 같이 몇 가지 간단한 구조를 통해 정의되어 있는지 확인 할 수 있습니다 내가 특정 상자를 사용하기를 원한다면기본값을 에뮬레이트하기위한 조건부 매크로 정의

#if defined(USE_INNER_BOUNDING_BOX) && defined(USE_OUTER_BOUNDING_BOX) 
    #undef USE_INNER_BOUNDING_BOX 
    #undef USE_OUTER_BOUNDING_BOX 
    #define USE_INNER_BOUNDING_BOX 
#endif 

#ifndef USE_INNER_BOUNDING_BOX 
    #ifndef USE_OUTER_BOUNDING_BOX 
     #define USE_INNER_BOUNDING_BOX 
    #endif 
#endif 

지금, 난 그냥 해당 매크로를 정의 할 수 있습니다. 난이도는 USE_DEFAULT_BOUNDING_BOX이라는 기본 설정 매크로를 사용하고 싶습니다.이 매크로를 사용하여 명시 적으로 정의되거나 모두 정의되지 않은 경우 USE_INNER_BOUNDING_BOX 또는 USE_OUTER_BOUNDING_BOX 중 하나에 대해 정의를 설정할 수 있습니다. 필자는 이식 가능한 코드를 선호하지만 컴파일러 관련 트릭도 통과 할 수 있습니다. Visual Studio 2012을 사용하고 있습니다.

+1

질문에 대한 답변은 없지만 'BOUNDING_BOX_TO_USE'스위치를 'INNER == 1' 'OUTER == 2'라는 단일 스위치로 정의하지 않으시겠습니까? 그렇게하면 본질적으로 두 가지가 될 수 없습니다. – Yunnosch

+0

비슷한 줄에 뭔가 쓸 수 있습니다. 그 때 나에게 공격하지 않았다. :) 다르게 구현하려고합니다. 그러나 여전히 우발적 인 질문이며 재미 있었기 때문에 물었습니다. :) – user2338150

+0

이 매크로 블록은 이미 원하는대로 수행합니다. 둘 다 정의되거나 정의되지 않은 매크로 중 하나를 정의하십시오. 그것은 더 짧을 수 있습니다. – VTT

답변

1

신뢰할 수있는 하나의 - 많은 선택이 더 나은 바로 하나의 다중 값 스위치를 선택하여 수행 할 수 있습니다.

#define BOUNDING_INNER 1 
#define BOUNDING_OUTER 2 

/* default */ 
#define BOUNDING_BOX_TO_USE BOUNDING_INNER 

/* alternatively please activate below line 
#define BOUNDING_BOX_TO_USE BOUNDING_OUTER 
*/ 

일부 구성에 이전 버전과 호환 유지해야하는 경우,
예를 들어, 코드가 이미 다른 사람에 의해 사용 된 경우
두 개에서 하나의 스위치를 파생시켜 기본 동작과 일치시킬 수 있습니다. 이점은 #undef을 피하는 것입니다 (이점이있는 경우에 대비하여).

// Comment to use bigger outer Bounding-Box 
#define USE_INNER_BOUNDING_BOX 

#define INNER_BOUNDING_BOX 0 
#define OUTER_BOUNDING_BOX 1 

#define DEFAULT_BOUNDING_BOX OUTER_BOUNDING_BOX 

#if defined(USE_INNER_BOUNDING_BOX) && !defined(USE_OUTER_BOUNDING_BOX) 
    #define USE_BOUNDING_BOX INNER_BOUNDING_BOX 
#elif defined(USE_OUTER_BOUNDING_BOX) 
    #define USE_BOUNDING_BOX OUTER_BOUNDING_BOX 
#else 
    #define USE_BOUNDING_BOX DEFAULT_BOUNDING_BOX 
#endif 

#if (USE_BOUNDING_BOX == INNER_BOUNDING_BOX) 
    #undef USE_OUTER_BOUNDING_BOX 
    #define USE_INNER_BOUNDING_BOX 
#else 
    #undef USE_INNER_BOUNDING_BOX 
    #define USE_OUTER_BOUNDING_BOX 
#endif 

이 바로이 경우에 작동합니다 : 여기

#if defined(USE_INNER_BOUNDING_BOX) && defined(USE_OUTER_BOUNDING_BOX) 
#define BOUNDING_BOX_TO_USE BOUNDING_INNER 
#endif 

#ifndef USE_INNER_BOUNDING_BOX 
    #ifndef USE_OUTER_BOUNDING_BOX 
     #define BOUNDING_BOX_TO_USE BOUNDING_INNER 
    #endif 
#endif 

/* In case you are as paranoid a programmer as I am, 
    you might want to do some plausibility checking 
    here. ifndef, >0, <2 etc., triggering some #errors. */ 


/* Later, in code doing the actual implementation: */ 

#if (BOUNDING_BOX_TO_USE == BOUNDING_INNER) 
/* do inner bounding stuff */ 
#endif 
/* other code, e.g. common for inner and outer */ 
#if (BOUNDING_BOX_TO_USE == BOUNDING_OUTER) 
/* do outer bounding stuff */ 
#endif 
+0

답변으로 봅니다. equals 블록 대신 USE_OUTER_BOUNDING_BOX 또는 USE_INNER_BOUNDING_BOX를 정의하고 이전 블록의 블록을 다른 블록으로 대체합니다. 예, 정의를 그대로 유지하고 undefs를 피하고 싶습니다. 연결되지 않은 인식되지 않은 코드의 정의가 상충되는 상황에 처한 적이 없으므로 일반적인 의미에서 좋은 방법이 아닙니까? – user2338150

+0

나는 당신이 요구하는 연습을 실제로 얻지 못한다고 생각합니까? undef 사용? 제 생각에는 좋지 않습니다. 이미 배포 된 구성 개념과 역 호환이 가능합니까? 잘 됐네. 상충되는 정의 정리? 좋은. 그렇게하기위한 undefs 제거하기? 좋은. – Yunnosch

+1

예, IDE 또는 프로젝트 파일 인 Makefile에서 정의를 놓친 것입니다. 미안, 나는 대화의 중간에 떠나야 만했다. 어쨌든, 나는 당신이 겪었던 것처럼 보이는 코드 컴파일 슬픔을 공유 할 수 있다고 생각합니다. 너는 편집증 환자가되고 싶다. 나는 다른 생각을 할 수 있으면 좋겠다. – user2338150

0

I 하나만 부울 변수를 사용하는 것이 두 개의 값이 존재하기 때문에 :

#ifndef USE_OUTER_BOUNDING_BOX 
    #define USE_OUTER_BOUNDING_BOX 0 
#endif 

USE_OUTER_BOUNDING_BOX가 제로의 경우 (거짓) 내부 바운딩 박스가 사용된다.

TEST.C :

#include <stdio.h> 

#ifndef USE_OUTER_BOUNDING_BOX 
    #define USE_OUTER_BOUNDING_BOX 0 
#endif 

int main(void) 
{ 
    printf("%d\n", USE_OUTER_BOUNDING_BOX); 
    return 0; 
} 

예 : 것과 같은

$ cc -o test -DUSE_OUTER_BOUNDING_BOX=0 test.c 
$ ./test 
0 
$ cc -o test -DUSE_OUTER_BOUNDING_BOX=1 test.c 
$ ./test 
1 
+0

이 경우에는 분명히 여기에서 작동 할 것입니다. 그러나 두 개 이상의 상자가 포함되어 있으면 과충전 전 처리기 트릭을 얻으려는 시도가있었습니다. 나는 그런 질문을 표현해야만했다. 어쨌든, 당신의 코드 역시 내 경우에는 작동 할 것이지만, 명시 적으로 지정하고 싶지 않은 매크로의 값에 대한 의존성이 필요하다. 나는이 빠른 수정으로 여기서 끝났다.물론 더 많은 상자 유형 (조건부 블록)을 위해 수정해야 할 필요가 있습니다. – user2338150

0

내가 끝난 것입니다. 상자가 더 많은 경우 조건부 블록을 추가합니다.