나는에 CentOS 6.4에 구축하려고 다음과 같은 오류를 받고 있어요 : 유일한 플래그는 여기에 통과 -Wall하고되고 -std = C++ 11에서 GCC 4.7.2rapidjson에 대해 _snprintf가 선언되지 않았습니까?
/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를 포함 시키면 표준 네임 스페이스에서 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)
왜 C++ 코드에'stdio.h '를 사용하려고합니까? – devnull
오류 메시지에 따라 사용 가능한 _snprintf 선언을 얻으려고했습니다. stdio.h를 포함함으로써 snprintf를 전역 네임 스페이스에 선언함으로써이 문제를 해결할 것이라고 가정했습니다. 그 사건은 사실이 아니기 때문에 오류가 남아 있습니다. – jdt141
그냥 궁금 해서요 :'/ usr/local' 안에있는 소스의 압축을 풉니 다? – devnull