尝试构建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)
答案 0 :(得分:0)
您使用的是-ansi编译标志吗?
使用-ansi通常表示您希望标题仅显示 C89标准中提到的接口。但是C89没有描述 的snprintf
答案 1 :(得分:0)
(无法评论,所以我写这个作为答案)。
关于你的第二个问题:这不太可能与两阶段名称查找有关。错误消息只是说有一个非依赖的未定义smybol(_snprintf
)。
好的,为什么会这样?错误消息大约是_snprintf
,而不是snprintf
中实际使用的writer.h
,所以如果我不得不猜测我会说其他代码通过#define snprintf _snprintf
重新定义该名称在包含STL标头之前。你的代码中有类似的东西吗?如果可能,请将其删除。
要尝试的其他一些事项:如果可能,将writer.h
的包含移到文件的顶部(即在重新定义snprintf
之前)。如果无法实现,请在加入#undef snprintf
之前尝试writer.h
。
此外,仅此类重新定义会导致我的计算机出现不同的错误。为了澄清这一点:如何在系统上定义预处理器符号_GLIBCXX_USE_C99
?
如果这没有帮助,则需要更多信息。你可以发布完整的错误信息(也许是一个重现的最小例子)吗?