我尝试在MFC应用程序(VS2019)上使用rapidjson
。我只是简单地包含了rapidjson
头文件,如下所示:
#include "rapidjson/document.h"
BOOL CMyProjectDoc::OnNewDocument()
{
if (! CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
rapidjson::Document d;
d.Parse(json);
return TRUE;
}
我得到了:
\rapidjson\allocators.h(437,5): warning C4003: not enough arguments for function-like macro invocation 'max'
\rapidjson\allocators.h(437,5): error C2760: syntax error: unexpected token ')', expected 'expression'
我尝试在一个控制台应用程序中使用相同的rapidjson,使用相同的VS2019构建:
#include "rapidjson/document.h"
int main()
{
const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
rapidjson::Document d;
d.Parse(json);
return 0;
}
没有错误。当然,我比较了项目设置,即使它们是相同的:
MFC项目抛出错误...为什么?
1条答案
按热度按时间4uqofj5v1#
默认情况下,Windows头文件定义了名为
min
和max
的宏,这可能会与库代码冲突。要解决这个问题,您需要在包含任何Windows头文件之前使用#define NOMINMAX
预处理器指令,请求Windows头文件不定义宏。为了确保这不会发生得太晚,建议在命令行上传递proprocessor符号。要在Visual Studio中执行此操作,请右键单击项目,选择 Properties,导航到 Configuration Properties -〉C/C++ -〉Preprocessor,并将
NOMINMAX
添加到 Preprocessor Definitions。这需要对所有Configuration和Platform组合执行。这涵盖了使用库时的情况。另一方面,如果您正在创作库,则可以主动防止这些冲突发生:通过将
min
和max
括在括号中,它抑制了预处理器扩展。以下will compile,无论是否定义了NOMINMAX
: