2016-06-29 1 views
0

나는 모든 헤더 라이브러리 인 rapidjson을 사용하고 있습니다. rapidjson.h에서, 거기에 내가 다시 정의하고 싶습니다 내 CPP 파일 중 하나에, 매크로 RAPIDJSON_ASSERT, 그래서 내 파일의 맨 위에있는이 코드가 다음 whay는 rapidjson.hRAPIDJSON_ASSERT을 정의하는 다음단일 cpp 파일에 매크로 재정의를 적용 할 수 있습니까?

#include "stdafx.h" // for windows 
#pragma push_macro("RAPIDJSON_ASSERT") 
#define RAPIDJSON_ASSERT(x) if(!(x)) throw std::logic_error("rapidjson exception"); 

#include "rapidjson/rapidjson.h" 
#include "rapidjson/document.h" 
#include "rapidjson/stringbuffer.h" 
#include "rapidjson/writer.h" 

.... 
.... 
#pragma pop_macro("RAPIDJSON_ASSERT") 

입니다 다음 RAPIDJSON_ASSERT 논리를 무시하는

#ifndef RAPIDJSON_ASSERT 
#include <cassert> 
#define RAPIDJSON_ASSERT(x) assert(x) 
#endif // RAPIDJSON_ASSERT 

문서 상태는, 당신은 당신이 어떤 파일을 포함하기 전에 RAPIDJSON_ASSERT을 정의해야합니다.

디버거에서 코드를 실행하면 RAPIDJSON_ASSERT이 재정의되지 않는 것이 문제입니다. 나는 rapidjson 헤더 파일을 포함 할만한 무엇이든을 위해 stdafx.h을 점검했고, 아무것도 없다.

각 컴파일 단위가 헤더 파일을 통해 실행되어야한다는 가정하에있었습니다.

매크로의 재정의를 stdafx.h으로 옮기면 매크로가 재정의 되겠지만 컴파일 단위별로 처리 할 수 ​​있기를 바랬습니다. 그렇게, 당신이이 정의 된 장소 후 #DEFINE을 추가해야하는 경우

rapidjson 코드 자체에 대한 RAPIDJSON_ASSERT의 정의를 변경하려면 같은

+1

는 당신이 STDAFX.H에서 rapidjson 포함 할 사용하여 라이브러리의 일을 재정의 할 수있는 좋은 일이 아니라고? – jaggedSpire

+0

패턴이 잘못되었습니다. 이 번역 단위의 rapidjson 내부 또는 단순히 번역 단위 내부의 매크로를 변경 하시겠습니까? 후자의 경우, rapidjson 헤더 다음에 다시 정의하십시오. 그렇지 않으면 rapidjson이 단순히 매크로 자체를 다시 정의 할 수 있습니다. – KABoissonneault

+0

@jaggedSpire - stdafx.h에 rapidjson.h를 포함하지 않았으므로 매크로를 재정의하지 않는 이유는 확실하지 않습니다. – bpeikes

답변

1

보인다. 당신이 rapidjson.h 파일을 편집 할 않는 한, 유일한 대안은이 작업을 수행하는 것입니다

#include "stdafx.h" // for windows 

// One would assume that the macro gets defined somewhere inside here 
#include "rapidjson/rapidjson.h" 

// Compiler will complain about macro redefinition without this #undef 
#undef RAPIDJSON_ASSERT  
#define RAPIDJSON_ASSERT(x) if(!(x)) throw std::logic_error("rapidjson exception"); 

#include "rapidjson/document.h" 
#include "rapidjson/stringbuffer.h" 
#include "rapidjson/writer.h" 

지금 RAPIDJSON_ASSERT의 정의는 헤더 파일의 나머지 부분에 대한 변경됩니다. 당신은 push_macro 및 pop_macro 헛소리가 필요하지 않습니다 - 매크로 각 단위

참고 유효 그것은이 #DEFINE

+0

질문에 몇 가지 정보를 추가했지만 문서에서는 RAPIDJSON_ASSERT를 정의해야한다고 지정합니다. #ifndef 문 rapidjson.h가 어떻게 든 모든 컴파일 단위에서 한 번만 검사되는 것처럼 보입니다. – bpeikes

+1

미리 컴파일 된 헤더를 완전히 끄고 시도해보십시오. –

+0

미리 컴파일 된 헤더가 문제 일 수 있다고 생각했습니다. 나는 그것을 시도 할 것이다. – bpeikes

관련 문제