2013-04-02 6 views
1

나는에 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 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

왜 C++ 코드에'stdio.h '를 사용하려고합니까? – devnull

+0

오류 메시지에 따라 사용 가능한 _snprintf 선언을 얻으려고했습니다. stdio.h를 포함함으로써 snprintf를 전역 네임 스페이스에 선언함으로써이 문제를 해결할 것이라고 가정했습니다. 그 사건은 사실이 아니기 때문에 오류가 남아 있습니다. – jdt141

+0

그냥 궁금 해서요 :'/ usr/local' 안에있는 소스의 압축을 풉니 다? – devnull

답변

0

-ansi 컴파일 플래그를 사용하고 있습니까?

-ansi를 사용하면 일반적으로 헤더에 C90 표준에 언급 된 인터페이스 만 표시되도록하고 싶다고 말합니다. 그러나 C89는 설명하지 않았다 snprintf

+0

아니요, 그냥 -Wall 및 -std = C++을 전달하십시오. 11 – jdt141

0

(아직 논평 할 수 없기 때문에 대답으로 쓰고있다).

두 번째 질문에 대해서는 : 이것은 2 단계 이름 조회와 관련이 없습니다. 오류 메시지는 단순히 비 종속적 인 정의되지 않은 smybol (_snprintf)이 있다고 말합니다.

왜 그런가요? 오류 메시지는 _snprintf에 대한 것이고 writer.h에 실제로 사용 된 snprintf이 아니므로 STL 헤더를 포함하기 전에 #define snprintf _snprintf을 통해 그 이름을 재정의하는 다른 코드가 있다고 생각할 것입니다. 코드에 그런 것이 있습니까? 가능하면 제거하십시오.

시도해 볼만한 다른 사항 : 가능한 경우 의 재정의가 발생하기 전에 writer.h을 파일 상단으로 이동합니다 (가능한 경우). 가능하지 않은 경우 을 시도한 후 writer.h을 포함 시키십시오.

또한 이러한 재 정의만으로는 컴퓨터에서 다른 오류가 발생합니다. 이 문제를 명확히하기 위해서 : 시스템 상에 사전 처리기 심볼 _GLIBCXX_USE_C99이 어떻게 정의되어 있습니까?

그래도 도움이되지 않는다면 몇 가지 추가 정보가 필요합니다. 그런 다음 완전한 오류 메시지 (및 아마도 최소한의 예를 재현)를 게시 할 수 있습니까?

관련 문제