Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Visual C++ - 컴파일 에러 error C2059: syntax error: '__stdcall'

이상하군요, 다음의 코드에 실린 예제일 뿐인데,

GdiplusStartup function (gdiplusinit.h)
; https://learn.microsoft.com/en-us/windows/win32/api/gdiplusinit/nf-gdiplusinit-gdiplusstartup

#include <iostream>
#include <windows.h>
#include <gdiplusinit.h>

#pragma comment(lib, "Gdiplus.lib")

int main()
{
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;

    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);

    GdiplusShutdown(gdiplusToken);
}

이런 오류가 발생합니다.

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplusinit.h(41,17): error C2059: syntax error: '__stdcall'
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplusinit.h(110,26): error C3646: 'NotificationHook': unknown override specifier
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplusinit.h(110,42): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplusinit.h(123,19): error C2143: syntax error: missing ';' before '__stdcall'
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplusinit.h(123,19): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplusinit.h(126,38): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

첫 번째 error C2059가 발생한 소스 코드는 다음과 같습니다.

// C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplusinit.h 123    

extern "C" Status WINAPI GdiplusStartup(
    OUT ULONG_PTR *token,
    const GdiplusStartupInput *input,
    OUT GdiplusStartupOutput *output);

C2059 오류는 해석할 수 없는 심벌이 온 경우에 발생하는데요, "syntax error: '__stdcall'" 메시지에 따라 __stdcall 이전의 심벌을 해석할 수 없다는 의미입니다. 위의 코드에서 __stdcall은 WINAPI이므로 결국 오류는 "Status" 심벌이 원인이라는 것입니다. 실제로 다음과 같이 코드를 작성해 보면,

#include <iostream>
#include <windows.h>
#include <gdiplusinit.h>

int main()
{
    Status t;
}

컴파일 오류가 발생합니다.

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




그러니까, 그사이 Win32 SDK의 헤더가 내부적으로 많이 변했고, 그것을 learn.microsoft.com의 문서가 따라가지 못한 것입니다. 위의 오류를 해결하려면, 간단하게는 Status를 임의로 정하는 것도 가능합니다.

typedef in Status;

물론, 공식 헤더 파일을 ^^ 참고하는 것이 더 권장됩니다.

#include <gdiplustypes.h>
#include <gdiplusinit.h>




그런데, gdiplustypes.h를 포함하면 이번에는 다음과 같은 오류가 발생합니다.

// C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplustypes.h 50 

extern "C" {
typedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
}

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplustypes.h(50,49): error C2065: 'EmfPlusRecordType': undeclared identifier
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplustypes.h(50,67): error C2275: 'UINT': illegal use of this type as an expression
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplustypes.h(50,72): error C2275: 'UINT': illegal use of this type as an expression
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gdiplustypes.h(50,77): error C2059: syntax error: 'const'

다시, 위의 오류는 (EmfPlusRecordType을 정의한) gdiplusenums.h 파일을 포함하는 것으로 해결할 수 있습니다.

#include <windows.h>
#include <gdiplusenums.h>
#include <gdiplustypes.h>
#include <gdiplusinit.h>




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 9/10/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 91  [92]  93  94  95  96  97  98  99  100  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11666정성태8/22/201819280사물인터넷: 37. 아두이노 - 코딩으로 대신하는 오실레이터 회로의 소리 출력파일 다운로드1
11665정성태8/22/201822842사물인터넷: 36. 오실레이터 회로 동작을 아두이노의 코딩으로 구현하는 방법파일 다운로드1
11664정성태8/22/201822325개발 환경 구성: 393. 윈도우 환경에서 elasticsearch의 한글 형태소 분석기 설치 [1]
11663정성태8/22/201825134개발 환경 구성: 392. 윈도우 환경에서 curl.exe를 이용한 elasticsearch 6.x 기본 사용법
11662정성태8/21/201817930사물인터넷: 35. 병렬 회로에서의 커패시터파일 다운로드1
11661정성태8/21/201820574사물인터넷: 34. 트랜지스터 동작 - 컬렉터-이미터 간의 저항 측정파일 다운로드1
11660정성태8/19/201820047사물인터넷: 33. 세라믹 커패시터의 동작 방식파일 다운로드1
11659정성태8/19/201820020사물인터넷: 32. 9V 전압에서 테스트하는 PN2222A 트랜지스터파일 다운로드1
11658정성태8/18/201823504사물인터넷: 31. 커패시터와 RC 회로파일 다운로드3
11657정성태8/18/201821636사물인터넷: 30. 릴레이(Relay) 제어파일 다운로드3
11656정성태8/16/201816638사물인터넷: 29. 트랜지스터와 병렬로 연결한 LED파일 다운로드1
11655정성태8/16/201819290사물인터넷: 28. 저항과 병렬로 연결한 LED파일 다운로드1
11654정성태8/15/201820569사물인터넷: 27. 병렬 회로의 저항, 전압 및 전류파일 다운로드1
11653정성태8/14/201821113사물인터넷: 26. 입력 전압에 따른 LED의 전압/저항 변화 [1]파일 다운로드1
11652정성태8/14/201818502사물인터넷: 25. 컬렉터 9V, 베이스에 5V와 3.3V 전압으로 테스트하는 C1815 트랜지스터파일 다운로드1
11651정성태8/14/201824250사물인터넷: 24. 9V 전압에서 테스트하는 C1815 트랜지스터 [1]파일 다운로드3
11650정성태8/14/201818413사물인터넷: 23. 가변저항으로 분압파일 다운로드1
11649정성태8/12/201820283사물인터넷: 22. 저항에 따른 전류 테스트파일 다운로드1
11648정성태8/12/201821606사물인터넷: 21. 퓨즈를 이용한 회로 보호파일 다운로드3
11647정성태8/8/201822452오류 유형: 476. 음수의 음수는 여전히 음수가 되는 수(절대값이 음수인 수)
11646정성태8/8/201817767오류 유형: 475. gacutil.exe 실행 시 "Failure initializing gacutil" 오류 발생
11645정성태8/8/201820402오류 유형: 474. 닷넷 COM+ - Failed to load the runtime. [1]
11644정성태8/6/201823464디버깅 기술: 118. windbg - 닷넷 개발자를 위한 MEX Debugging Extension 소개
11643정성태8/6/201823212사물인터넷: 20. 아두이노 레오나르도 R3 호환 보드의 3.3v 핀의 LED 전압/전류 테스트 [1]파일 다운로드1
11642정성태8/3/201821494Graphics: 20. Unity - LightMode의 ForwardBase에 따른 _WorldSpaceLightPos0 값 변화
11641정성태8/3/201826942Graphics: 19. Unity로 실습하는 Shader (10) - 빌보드 구현 [1]파일 다운로드1
... 91  [92]  93  94  95  96  97  98  99  100  101  102  103  104  105  ...