2013-04-02 7 views
1

Я получаю следующее сообщение об ошибке при попытке построить на 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)

+0

Почему вы пытаетесь использовать 'stdio.h' для кода на C++? – devnull

+0

Я пытался получить объявление _snprintf, доступное, за сообщение об ошибке. Я предположил (ошибочно), что, включив stdio.h, он объявит snprintf в глобальном пространстве имен и это решит эту проблему. Это оказалось не так, поэтому ошибка остается. – jdt141

+0

Просто любопытно: вы разархивировали источники внутри '/ usr/local'? – devnull

ответ

0

Вы используете флаг -ansi compile?

Использование -ansi обычно говорит о том, что вы хотите, чтобы заголовки отображали ТОЛЬКО интерфейсы , упомянутые в стандарте C89. Но C89 не описал snprintf

+0

Нет, просто пройдя -Wall и -std = C++ 11 – jdt141

0

(Не могу прокомментировать, поэтому я пишу это как ответ).

Что касается вашего второго вопроса: маловероятно, что это связано с поиском двухфазного имени. В сообщении об ошибке просто говорится, что существует не зависящий неопределенный smybol (_snprintf).

Хорошо, почему это происходит? Сообщение об ошибке составляет около _snprintf, а не фактически использовано snprintf в writer.h, поэтому, если бы я должен был догадаться, я бы сказал, что есть другой код, переопределяющий это имя через #define snprintf _snprintf, прежде чем включать заголовки STL. В коде есть что-то подобное? Если возможно, удалите его.

Некоторые другие вещи, которые следует попробовать: Переместите включение writer.h в начало файла (то есть до переопределения snprintf), если это возможно. Если это невозможно, попробуйте #undef snprintf перед включением writer.h.

Кроме того, такое переопределение приводит к другой ошибке на моей машине. Чтобы прояснить это: Как обозначается препроцессорный символ _GLIBCXX_USE_C99 в вашей системе?

Если это не поможет, потребуется дополнительная информация. Не могли бы вы опубликовать полное сообщение об ошибке (и, возможно, минимальный пример для воспроизведения)?

 Смежные вопросы

  • Нет связанных вопросов^_^