2014-09-19 1 views
1

다음은 간단한 예입니다. 라이브러리 B와 C를 사용하여 프로그램 A를 작성한다고 가정합니다. Niether 라이브러리의 소스 코드는 변경 될 수 있으며이 라이브러리는 목적을 위해 유일하게 사용 가능한 라이브러리입니다. 라이브러리 B는 #define이 적당하지만 라이브러리 C는 바보가#define입니다. 같은 뭔가 말 : 내가 가지고있는 선례 대부분의 #define 조건부 # include-d 라이브러리와 충돌합니다.

//library_b_header.hpp 
#pragma once 
#define uint16 unsigned short 

//... 

//library_c_header.hpp 
#pragma once 
#define uint16 unsigned char 

this 같은 질문입니다.

  • 직접 library_c_header.hpp를 포함하지 마십시오 자신의 코드에 #undef를 추가 한 대답은 유용하게 내가 (의역) 본 적이 제안의 범위를 포함, 제안한다. 다른 라이브러리에 포함되어있는 경우 해당을 직접 포함하지 마십시오. 대신 별도의 .cpp 파일에 포함하면 헤더의 래퍼 기능을 노출 할 수 있습니다.
  • 자신의 심볼 이름을 변경하십시오.

두 번째 옵션은 내 일반적인 솔루션과 비슷하지만 라이브러리 C가 큽니다. 나는 모든 기능을 포장 할 수는 없다. 그렇게 할 수는 있어도 엉망이 될 확률이 높습니다. 라이브러리 C의 새 릴리스 (이 라이브러리는 빈번하게 사용됨)에는 확실히 이식 할 수 없습니다.

세 번째 옵션은 모든 곳에서 사용되기 때문에 작동하지 않습니다. 이 부분과 충돌하는 것은 이 아닙니다. 문자 그대로 과 충돌합니다.. 나는 일 수 있다고 가정합니다. . . 그것은 단지 의 MORALLY WRONG입니다. #define이며 죽을 것입니다!

첫 번째 옵션은 내가 시도하는 것과 가장 비슷합니다. 두 번째 문제는 #include 라이브러리 C 이 라이브러리 B에 정의 된 토큰에 종속된다는 것입니다.

#include <library_b/library_b_header.hpp> 
#define library_b_uint16 uint16 
#undef uint16 

#ifdef LIBRARY_B_SYMBOL 
    #include <library_c/library_c_header.hpp> 
    #undef uint16 
    #define uint16 library_b_uint16 
#endif 

이 명확하게 작동하지 않습니다, 그러나 아마 그것은 나의 의도를 표현 :

내가 들어 왔 가장 먼입니다. 내가 할 수있는 다른 것이 있습니까? 컴파일러는 push_macropop_macro 프라그 마를 지원하는 경우

+0

저는 약간 혼란 스럽습니다. 라이브러리 C는 라이브러리 B에 의존하지만 라이브러리 B와도 충돌합니까? –

+0

@MichaelBurr 라이브러리는 관련이 없지만 쓰여지는 프로그램은 심볼이 B에 정의 된 경우에만 C를 포함 할 수 있습니다. 예제를 참조하십시오. – imallett

답변

3

, 당신과 같이 사용할 수 있습니다.

#include <library_b/library_b_header.hpp> 

#pragma push_macro("uint16") 
#undef uint16 
#include <library_c/library_c_header.hpp> 
#pragma pop_macro("uint16") 

(이 pragma를 비표준,하지만 그들은 광범위하게 지원하는 비주얼 C++, GCC, 그 소리, 및 인텔 C++ 컴파일러 모두 지원합니다.)

예,이 매크로를 정의하는 라이브러리 C의 헤더를 포함하는 모든 곳에서이 작업을 수행해야하지만 일반적으로 라이브러리 포함을 감싸는 자체 헤더를 작성하면이 매크로가 간단 해집니다. C 헤더를 생성 한 다음 프로젝트에 라이브러리 C가 필요한 모든 헤더를 포함합니다.

+0

MSVC와 g ++ 모두에서 작업하면 충분합니다.+1 나를 가르쳐'push_macro' /'pop_macro'. 문제 해결을 위해 수락하십시오. 감사! – imallett