Я получаю следующее сообщение об ошибке при попытке построить на CentOS 6.4: Единственные флаги передается здесь -Wall и -std = C++ 11, с помощью GCC 4.7.2Undeclared _snprintf для fastjson?
/usr/local/include/rapidjson/writer.h: In member function ‘void rapidjson::Writer::WriteDouble(double)’: /usr/local/include/rapidjson/writer.h:173:53: error: there are no arguments to ‘_snprintf’ that depend on a template parameter, so a declaration of ‘_snprintf’ must be available [-fpermissive] /usr/local/include/rapidjson/writer.h:173:53: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
Код в вопрос: (от 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)
Почему вы пытаетесь использовать 'stdio.h' для кода на C++? – devnull
Я пытался получить объявление _snprintf, доступное, за сообщение об ошибке. Я предположил (ошибочно), что, включив stdio.h, он объявит snprintf в глобальном пространстве имен и это решит эту проблему. Это оказалось не так, поэтому ошибка остается. – jdt141
Просто любопытно: вы разархивировали источники внутри '/ usr/local'? – devnull