c++ rapidjson适用于控制台应用程序,但不适用于mfc应用程序

dphi5xsq  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(308)

我尝试在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项目抛出错误...为什么?

4uqofj5v

4uqofj5v1#

默认情况下,Windows头文件定义了名为minmax的宏,这可能会与库代码冲突。要解决这个问题,您需要在包含任何Windows头文件之前使用#define NOMINMAX预处理器指令,请求Windows头文件不定义宏。
为了确保这不会发生得太晚,建议在命令行上传递proprocessor符号。要在Visual Studio中执行此操作,请右键单击项目,选择 Properties,导航到 Configuration Properties -〉C/C++ -〉Preprocessor,并将NOMINMAX添加到 Preprocessor Definitions。这需要对所有Configuration和Platform组合执行。
这涵盖了使用库时的情况。另一方面,如果您正在创作库,则可以主动防止这些冲突发生:通过将minmax括在括号中,它抑制了预处理器扩展。以下will compile,无论是否定义了NOMINMAX

#include <Windows.h>
#include <algorithm>

int main() {
    auto m = (std::min)(42, 7);
    return m;
}

相关问题