본문 바로가기

MFC/Error

error C2146: syntax error : missing ';' before identifier 'PVOID64'

위 에러의 원인은...


DirectX 관련 라이브러리가 배포하는 basetsd.h 라는 파일 때문이다.

어떤 이유인지는 모르겠으나... DirectX 관련 라이브러리들 중 그들이 배포하는 basetsd.h 파일에는 
POINTER_64 라는 키워드에 대한 define 이 빠져있기 때문이다.

에러가 발생하는 과정은....
windows.h 에서 winnt.h 를 include 하고, winnt.h 가 PVOID64 를 정의하기 위해 

typedef void * POINTER_64 PVOID64;

위와같이 typedef 를 하는데 POINTER_64 키워드 정의를 찾기위해 basetsd.h 파일을 include 한다.
그런데, VisualStudio 등의 설치된 SDK의 include 에 있는 basetsd.h 에는 POINTER_64에 대한 정의가 있지만, '프로젝트 설정,C/C++, 일반' 의 '추가 포함 디렉터리' 란에 POINTER_64의 정의가 없는 basetsd.h 파일이 있는 디렉토리를 설정함으로 인해 위의 컴파일 에러가 발생하게 된다.

근본적인 해결책은,
POINTER_64 키워드에 대한 정의가 빠진 basetsd.h 파일을 include 하지 않도록 이 파일을 제거하거나, 만약 기어코 이 파일을 써야겠다면, 그 파일에 아래와 같은 정의를 포함해야 한다.

#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif

'MFC > Error' 카테고리의 다른 글

"There is no source code available for the current location"  (0) 2015.04.22
Detected memory leaks!  (0) 2012.12.26
error C2236: unexpected 'class'  (0) 2012.12.26