由RapidJSON发现的成员函数与宏冲突问题

在使用RapidJson的时候,发现了一个之前很少注意到的问题:

F:\Projects\test\rapidjson-1.1.0\include\rapidjson\document.h(982,70): error : too few arguments provided to function-like macro invocation
if (a < static_cast(-std::numeric_limits::max())

乍一看好像不是很眼熟的错误提示,没看懂什么意思,惯例搜索引擎查,于是很快发现了这个: https://stackoverflow.com/questions/1394132/macro-and-member-function-conflict ,简单一看就反应过来了,原来是成员函数名(这里是max)和之前不知在哪定义过的同名max冲突了,编译器把本该作为成员函数调用的max当成作了替换,于是就出现了上面的错误。

解决方法也很简单,把要调用的成员函数先用括号括起来:

// 原来出错的
int max = numeric_limits<int>::max();
// 括起来不会出错的
int max = (numeric_limits<int>::max)();

这样就不会出和定义冲突的问题了,只是平时很少注意这个问题,更别说这种括号套函数的写法了。后来还说去github上看看能不能来个PR把这问题改了,结果一查才发现,原来是我习惯性的从 https://github.com/Tencent/rapidjson/releases 这里down了自以为是最新版v1.1.0的库代码,而实际上还没release的master上早就有人把这个issue改好了: https://github.com/Tencent/rapidjson/commit/6e38649ec61e5f4f382c257a6b27698bb55eff61#diff-4a56fc9353bac10cf2f51e22e38e3b2a ,略汗,不过还好,自己查了下又学到了点新东西。

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。