2009-09-03 5 views
0

Dev-C++ (버전 4.9.9.2)와 함께 제공되는 표준 컴파일러를 사용하여 누군가의 오래된 C++ 프로젝트를 재구성하려고합니다. (MinGW를 사용하는 g ++라고 생각합니다.) Windows XP Pro SP3 32 비트에서. 파일 중 하나에서 strsafe.h 포함되어 내가 컴파일하려고하면이 오류 얻을 : 오류 점 (strsafe.h에서 마이크로 소프트() 라이브러리이다하는 것을 코드의strsafe.h의 ','토큰 앞에 예상 주된 표현

expected primary-expression before ',' token 

의 선을 헤더 파일)은 다음과 같이 표시됩니다.

이러한 각 줄에는 2 개의 "예상 기본 표현식"오류가 있습니다. this forum thread은 NULL 값이 올바르게 인식되지 않았 음을 나타내고 strsafe.h 앞에 <cstddef>이 포함되어 있음을 나타냅니다. 나는 그것을했고 그것은 효과가 없다. 또한 NULL이 실제로 정의 된 것처럼 보입니다. 왜냐하면 strsafe.h를 포함하기 전에 '#define NULL 0'을 수행 할 때 거기에 그것을 재정의한다는 오류가 발생하기 때문입니다.

죄송합니다. 더 자세한 정보를 제공해 드릴 수는 없지만이 오류를 재현하는 코드는 단순히 '#include <strsafe.h>'입니다. 따라서 다른 말을해야할지 모르겠습니다. 아무도 무슨 일이 벌어지고 있고 어떻게 해결할 수 있을지 전혀 생각하지 못했습니까?

감사합니다.

내가 NULL로 정의됩니다 궁금해

+0

사용중인 SDK의 버전은 무엇입니까? (strsafe.h의 전체 경로는 무엇입니까?) Vista SDK의 사본에는 StringGetsExWorkerA()에 대한 언급이 없습니다. –

+0

별도의 포럼에서 언급 한 비슷한 문제가있는 것 같습니다 : http://forums1.avsim.net/index.php?s = 6bf19a616003413c15cf25212fde2352 & showtopic = 244719 & pid = 1617949 & st = 0 & # entry1617949. 이 포럼은 특히 strsafe.h와 MinGW에 대해 언급합니다. 문제를 해결하기 위해 수행 한 작업을 시도해 볼 수 있습니까? – reuben

+0

PSDK-x86 버전을 다운로드 한 곳 : http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist (Windows® Server 2003 SP1 Platform SDK). strsafe.h에 대한 경로는 "C : ₩ Program Files ₩ Microsoft Platform SDK ₩ Include ₩ strsafe.h"입니다. @Rueben : "솔루션"은 다른 환경/컴파일러를 사용하는 것 같습니다. 나는 MSVC++을 시도해 보았지만 프로젝트에 다른 문제가 있었지만 여기서 요구하는 문제가 없다는 것이 옳다. – Jordi

답변

0

(난 이미 그래서 strsafe.h의 최신 버전이 Microsoft 플랫폼 SDK의 최신 버전을 다운로드 시도)? 어쩌면 0이 아니며, 아무 것도 될 수 있습니다 (NULL이 0이 아닌 다른 것으로 정의 된 경우 실제로는 이상합니다).

다음을 시도하여 제대로 작동하는지 확인하십시오.

#undef NULL 
#define NULL 0 
+0

C에서 NULL은 일반적으로 C++에서 스트레이트 0이지만 (void *) 0으로 정의됩니다. –

+0

이것은 실제로 효과가있었습니다. (이제 다른 문제가 있지만이 두 줄의 코드를 사용하여이 문제가 해결되었습니다.) – Jordi

+0

@Tyler, C 또는 C++에서는 NULL과 같은 것이 없습니다. 일부/대부분의 컴파일러는 그것을 (void *) 0 또는 0으로 정의 할 수 있지만 NULL을 다른 것으로 정의하는 헤더/라이브러리/thirdparty 코드/컴파일러를 중단시키는 것은 절대적으로 없습니다. NULL은 표준의 일부가 아니므로 사용해서는 안됩니다. – Glen

0

필자의 초기 생각은 적어도 하나의 식별자가 아직 선언되지 않았을 것입니다.

  • 이 줄을 차례로 각 식별자에 대한 사전 처리 된 출력과
  • 의 위치를 ​​사전 처리 된 출력을 생성 할 수있는 옵션에 대한 컴파일러 문서를 확인 (그것을 생성), 검색 :

    다음을 시도 역방향으로 선언문을 찾으십시오.

식별자가 선언되지 않았거나 그 중 하나가 객체가 아닌 유형으로 선언 된 경우가 있습니다. 이 기능은 내부 사람이 (이 #ifndef STRSAFE_LIB_IMPL .... #endif 블록으로 둘러싸여)이며이 StringCbGetsExA 또는 StringCbGetsExA 같은 기능의 주위에 감싸 인 것처럼 그것은 보인다 strsafe.h 파일을 통해 찾고

0

. 대신 그걸 사용해서는 안됩니까?

+0

거의 모든 기능이 발생하지만 그 기능을 호출하고 있다고 생각조차하지 않습니다. 라이브러리를 포함 시키면 컴파일이 실패하게됩니다. – Jordi

0

포함 경로에 SDK 헤더가 혼합되어 있다고 생각합니다. 포함 경로를 확인하십시오. gcc의 "-H"옵션을 사용하면 어떤 믹싱이 발생했는지 알 수 있습니다.

+0

미안하지만 어떻게해야할지 모르겠다. Dev-Cpp 환경의 컴파일 버튼을 사용하고 있으며 gcc가 호출 된 다른 매개 변수를 알지 못합니다. 게다가, 나는 아마 출력물로 무엇을해야할지 모른다. – Jordi

+0

Dev-Cpp에 대해서는 아무 것도 모르므로 "방법"을 도울 수는 없습니다. 그러나 정보를 얻었을 때 최악의 경우 질문을 편집하면 도움을받을 수 있습니다. –

관련 문제