다음은 간단한 예입니다. 라이브러리 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_macro
및 pop_macro
프라그 마를 지원하는 경우
저는 약간 혼란 스럽습니다. 라이브러리 C는 라이브러리 B에 의존하지만 라이브러리 B와도 충돌합니까? –
@MichaelBurr 라이브러리는 관련이 없지만 쓰여지는 프로그램은 심볼이 B에 정의 된 경우에만 C를 포함 할 수 있습니다. 예제를 참조하십시오. – imallett