我使用的是rapidjson,这是一个全部的头库。在rapidjson.h
中,有一个宏RAPIDJSON_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.h
定义RAPIDJSON_ASSERT
的问题:
#ifndef RAPIDJSON_ASSERT
#include <cassert>
#define RAPIDJSON_ASSERT(x) assert(x)
#endif // RAPIDJSON_ASSERT
文档指出要覆盖RAPIDJSON_ASSERT
逻辑,您只需在包含任何文件之前定义RAPIDJSON_ASSERT
。
问题是,当我在调试器中运行代码时,RAPIDJSON_ASSERT
未被重新定义。我检查了stdafx.h
包含rapidjson头文件的任何内容,并且没有任何内容。
我假设每个编译单元都应该运行头文件。
请注意,如果我将宏的重新定义移动到stdafx.h
,我会重新定义宏,但我希望能够按编译单元执行此操作。
答案 0 :(得分:1)
您似乎想要为rapidjson代码本身更改RAPIDJSON_ASSERT的定义
如果是这样,您需要在定义它之后添加#define。除非您想编辑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 shenanigans - 宏仅对每个单元有效
请注意,使用#define重新定义库的内容并不是一件好事