2017-11-13 8 views
2

일부 변수를 정의하는 매크로가 있다고 가정합니다. 코드의 다른 부분에서 두 가지 방법으로 정의해야합니다 (예, 나쁜 아이디어이지만 리팩터링은 좋은 방법입니다).큰 블록의 C++ 매크로를 뒤집을 수 있습니까?

아래 스 니펫이 작동하도록 할 수 있습니까? 즉, 4와 1을 출력 할 수 있습니까?

#include <iostream> 
#define ENABLE 
#ifdef ENABLE 
#define B 4 
#define C 5 
//imagine a bunch more here 
#else 
#define B 1 
#define C 2 
//imagine a bunch more here 
#endif 

int main() 
{ 
    std::cout << B << std::endl; 
#pragma push_macro("ENABLE") 
#undef ENABLE 
    std::cout << B << std::endl; 
#pragma pop_macro("ENABLE") 

    return 0; 
} 

은 특히 B를 정의하여 같은 효과를 달성하기 위해 확실히 가능하지만, 내가 매크로의 큰 블록이있는 경우, 그 실제적인 100 % 아니다 :

#include <iostream> 
#define B 4 

int main() 
{ 
#pragma push_macro("B") 
#undef B 
#define B 1 
    std::cout << B << std::endl; 
#pragma pop_macro("B") 
    std::cout << B << std::endl; 
    return 0; 
} 
+0

enable을 명령 줄 플래그로 설정하고 플래그를 지정하거나 설정하지 않고 컴파일 할 수 있습니다. –

+0

같은 프로젝트에 있습니다. 그것은 끔찍한 부분입니다. 두 블록 모두 특정 컴파일에서 라이브 코드이며 다른 영역에서 다르게 정의됩니다. – Carbon

+0

@ Carbon 본 매크로 블록을 모두 적절한 대체 방법으로 교체해야하는 것으로 보입니다. – VTT

답변

10

당신은 그것을 할 수있을를

헤더 : 반복적으로 #include하여 헤더 파일을 보내고

// Note: no inclusion guards! 
#undef B 
#undef C 
#ifdef ENABLE 
#define B 4 
#define C 5 
//imagine a bunch more here 
#else 
#define B 1 
#define C 2 
//imagine a bunch more here 
#endif 

소개 src 파일의 나이 :

int main() 
{ 
#define ENABLE 
#include "header" 
    std::cout << B << std::endl; 
#undef ENABLE 
#include "header" 
    std::cout << B << std::endl; 
    return 0; 
} 
+0

이제는 멋진 트릭이다! 이 엉망이 excised 때까지, 나는 그것을 사용하고있을거야. 고마워. – Carbon

+4

이것은 역겨운 일입니다. 나는 upvoted. –

+1

이것은 인터넷에서 지시 사항을 따르고'sed'로 깨진'.so' 파일을 고쳤던 때와 거의 같은 것입니다. – Omnifarious