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

비밀번호

댓글 작성자
 




... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
13079정성태6/17/202214274오류 유형: 814. 파이썬 - Error: The file/path provided (...) does not appear to exist
13078정성태6/16/202218039.NET Framework: 2021. WPF - UI Thread와 Render Thread파일 다운로드1
13077정성태6/15/202219001스크립트: 40. 파이썬 - PostgreSQL 환경 구성
13075정성태6/15/202215630Linux: 50. Linux - apt와 apt-get의 차이 [2]
13074정성태6/13/202216456.NET Framework: 2020. C# - NTFS 파일에 사용자 정의 속성값 추가하는 방법파일 다운로드1
13073정성태6/12/202217068Windows: 207. Windows Server 2022에 도입된 WSL 2
13072정성태6/10/202217028Linux: 49. Linux - ls 명령어로 출력되는 디렉터리 색상 변경 방법
13071정성태6/9/202217786스크립트: 39. Python에서 cx_Oracle 환경 구성
13070정성태6/8/202218513오류 유형: 813. Windows 11에서 입력 포커스가 바뀌는 문제 [1]
13069정성태5/26/202220322.NET Framework: 2019. C# - .NET에서 제공하는 3가지 Timer 비교 [2]
13068정성태5/24/202219182.NET Framework: 2018. C# - 일정 크기를 할당하는 동안 GC를 (가능한) 멈추는 방법 [1]파일 다운로드1
13067정성태5/23/202216428Windows: 206. Outlook - 1년 이상 지난 메일이 기본적으로 안 보이는 문제
13066정성태5/23/202216599Windows: 205. Windows 11 - Windows + S(또는 Q)로 뜨는 작업 표시줄의 검색 바가 동작하지 않는 경우
13065정성태5/20/202217934.NET Framework: 2017. C# - Windows I/O Ring 소개 [2]파일 다운로드1
13064정성태5/18/202217344.NET Framework: 2016. C# - JIT 컴파일러의 인라인 메서드 처리 유무
13063정성태5/18/202217770.NET Framework: 2015. C# - 인라인 메서드(inline methods)
13062정성태5/17/202218238.NET Framework: 2014. C# - async/await 그리고 스레드 (4) 비동기 I/O 재현 [1]파일 다운로드1
13061정성태5/16/202217521.NET Framework: 2013. C# - FILE_FLAG_OVERLAPPED가 적용된 파일의 읽기/쓰기 시 Position 관리파일 다운로드1
13060정성태5/15/202221070.NET Framework: 2012. C# - async/await 그리고 스레드 (3) Task.Delay 재현파일 다운로드1
13059정성태5/14/202218909.NET Framework: 2011. C# - CLR ThreadPool의 I/O 스레드에 작업을 맡기는 방법 [1]파일 다운로드1
13058정성태5/13/202218914.NET Framework: 2010. C# - ThreadPool.SetMaxThreads 사용법 [1]
13057정성태5/12/202220427오류 유형: 812. 파이썬 - ImportError: cannot import name ...
13056정성태5/12/202216153.NET Framework: 2009. C# - async/await 그리고 스레드 (2) MyTask의 호출 흐름 [2]파일 다운로드1
13055정성태5/11/202221015.NET Framework: 2008. C# - async/await 그리고 스레드 (1) MyTask로 재현 [11]파일 다운로드1
13054정성태5/11/202217666.NET Framework: 2007. C# - 10진수 숫자를 담은 문자열을 숫자로 변환하는 방법 [11]파일 다운로드1
13053정성태5/10/202216875.NET Framework: 2006. C# - GC.KeepAlive 메서드의 역할
... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...