尝试在 CentOS 6.4 上构建时出现以下错误:此处传递的唯一标志是 -Wall 和 -std=c++11,使用 gcc 4.7.2
/usr/local/include/rapidjson/writer.h:在成员函数'void rapidjson::Writer::WriteDouble(double)'中:/usr/local/include/rapidjson/writer.h:173:53:错误:有'_snprintf' 没有依赖于模板参数的参数,因此'_snprintf' 的声明必须可用 [-fpermissive] /usr/local/include/rapidjson/writer.h:173:53:注意:(如果你使用“-fpermissive”,G++ 将接受您的代码,但不允许使用未声明的名称)
有问题的代码:(来自 rapidjson/writer.h)
void WriteDouble(double d) {
char buffer[100];
#if _MSC_VER
int ret = sprintf_s(buffer, sizeof(buffer), "%g", d);
#else
int ret = snprintf(buffer, sizeof(buffer), "%g", d); //this line is the troublemaker
#endif
RAPIDJSON_ASSERT(ret >= 1);
for (int i = 0; i < ret; i++)
stream_.Put(buffer[i]);
}
writer.h 文件的顶部如下所示:
#ifndef RAPIDJSON_WRITER_H_
#define RAPIDJSON_WRITER_H_
#include "rapidjson.h"
#include "internal/stack.h"
#include "internal/strfunc.h"
#include <cstdio> // snprintf() or _sprintf_s()
#include <new> // placement ne
这让我想到了这个问题:cstdio stdio.h namespace。
据我了解上述问题的答案,包含 cstdio 应在标准命名空间中声明 snprintf 符号。所以,我想包括 stdio.h 来获取在全局命名空间中定义的符号。无论我是否包含 cstdio、stdio.h 或两个文件(我不应该这样做),都会产生相同的编译错误
我的问题是两个部分:为什么 gcc 寻找 _snprintf 而不是 snprintf?还是我走错了路,这是否与 gcc 为模板参数绑定所做的两部分名称查找有关?(ala 10.8.2, http: //idlebox.net/2009/apidocs/gcc-4.4.1.zip/gcc-4.4.1/gcc_10.html#SEC315)