未申报的_snprintf for rapidjson?

时间:2013-04-02 15:01:24

标签: c++ linux rapidjson

尝试构建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

2 个答案:

答案 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

如果这没有帮助,则需要更多信息。你可以发布完整的错误信息(也许是一个重现的最小例子)吗?