可以将宏重定义应用于单个cpp文件吗?

时间:2016-06-29 19:50:36

标签: c++ macros rapidjson

我使用的是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,我会重新定义宏,但我希望能够按编译单元执行此操作。

1 个答案:

答案 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重新定义库的内容并不是一件好事