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)
11600정성태7/10/201825984Math: 43. GeoGebra 기하 (20) - 세 점을 지나는 원파일 다운로드1
11599정성태7/10/201823117Math: 42. GeoGebra 기하 (19) - 두 원의 안과 밖으로 접하는 직선파일 다운로드1
11598정성태7/10/201826426Windows: 147. 시스템 복구 디스크를 USB 디스크에 만드는 방법
11597정성태7/10/201828540사물인터넷: 17. Thinary Electronic - ATmega328PB 아두이노 호환 보드의 개발 환경 구성
11596정성태7/10/201825254기타: 72. 과거의 용어 설명 - OWIN
11595정성태7/10/201831220사물인터넷: 16. New NodeMCU v3 아두이노 호환 보드의 기본 개발 환경 구성
11594정성태7/8/201825472Math: 41. GeoGebra 기하 (18) - 원의 중심 및 접선파일 다운로드1
11593정성태7/8/201825329Math: 40. GeoGebra 기하 (17) - 각의 복사파일 다운로드1
11591정성태7/7/201823482Math: 39. GeoGebra 기하 (16) - 삼각형의 방심과 방접원파일 다운로드1
11590정성태7/7/201823822Math: 38. GeoGebra 기하 (15) - 삼각형의 수심파일 다운로드1
11589정성태7/7/201821843.NET Framework: 787. object로 형변환된 인스턴스를 원래의 타입 인자로 제네릭 메서드를 호출하는 방법 [2]파일 다운로드1
11588정성태7/7/201823433디버깅 기술: 116. windbg 분석 사례 - ASP.NET 웹 응용 프로그램의 CPU 100% 현상 (3)
11587정성태7/5/201825192.NET Framework: 786. ASP.NET - HttpCookieCollection을 다중 스레드에서 사용할 경우 무한 루프 현상
11586정성태7/5/201822759Math: 37. GeoGebra 기하 (14) - 삼각형의 무게 중심파일 다운로드1
11585정성태7/5/201824205Math: 36. GeoGebra 기하 (13) - 삼각형의 외심과 외접하는 원파일 다운로드1
11584정성태7/5/201822558Math: 35. GeoGebra 기하 (12) - 삼각형의 내심과 내접하는 원파일 다운로드1
11583정성태7/5/201823941.NET Framework: 785. public으로 노출되지 않은 다른 어셈블리의 delegate 인스턴스를 Reflection으로 생성하는 방법파일 다운로드1
11582정성태7/5/201829779.NET Framework: 784. C# - 제네릭 인자를 가진 타입을 생성하는 방법 [1]파일 다운로드1
11581정성태7/4/201827037Math: 34. GeoGebra 기하 (11) - 3대 작도 불능 문제의 하나인 임의 각의 3등분파일 다운로드1
11580정성태7/4/201824062Math: 33. GeoGebra 기하 (10) - 직각의 3등분파일 다운로드1
11579정성태7/4/201821683Math: 32. GeoGebra 기하 (9) - 임의의 선분을 한 변으로 갖는 정삼각형파일 다운로드1
11578정성태7/3/201821918Math: 31. GeoGebra 기하 (8) - 호(Arc)의 이등분파일 다운로드1
11577정성태7/3/201822556Math: 30. GeoGebra 기하 (7) - 각의 이등분파일 다운로드1
11576정성태7/3/201825395Math: 29. GeoGebra 기하 (6) - 대수의 4칙 연산파일 다운로드1
11575정성태7/2/201826359Math: 28. GeoGebra 기하 (5) - 선분을 n 등분하는 방법파일 다운로드1
11574정성태7/2/201825164Math: 27. GeoGebra 기하 (4) - 선분을 n 배 늘이는 방법파일 다운로드1
... 91  92  93  94  95  96  97  [98]  99  100  101  102  103  104  105  ...