win32 + C++/CX프로젝트에서 ConformanceMode때문에 생기는 문제

https://blogs.msdn.microsoft.com/vcblog/2017/11/15/msvc-conformance-improvements-in-visual-studio-2017-version-15-5/

Visual Studio 2017 15.5로 업데이트 하면 ConformanceMode란 놈을 디폴트로 켜버린다.
C++ 표준을 준수하게 하는 모드라고 한다.(니미 난 내 제품 만드는게 중요한데 C++표준이 알게 뭐냐. 사실상 게임업계에선 MSVC가 표준이지.)
이전에 만든 프로젝트라면 상관없지만 새로 만드는 프로젝트는 ConformanceMode가 켜지게 된다.

pure UWP 프로젝트는 아직 테스트 안해봤지만 Desktop App에서 C++/CX를 이용해서 UWP API를 호출하는 경우 문제가 된다.
ConformanceMode가 켜진 상태에서 데스크탑 프로젝트에서 Consume Wndows Runtime Extention을 켜면 다음과 같은 에러가 뜬다.

1>c1xx : warning C4199: two-phase name lookup is not supported for C++/CLI, C++/CX, or OpenMP; use /Zc:twoPhase-

일단 경고가 뜨는데 이 이후로 에러가 왕창 뜨기 때문에 이건 경고가 아니고 사실상 에러다.

그래서 /Zc:twoPhase- 옵션을 지정하면…

HttpClient^	httpClient = ref new HttpClient();
auto task_get = create_task(httpClient->GetAsync(uri));

이런 코드의 경우 다음과 같이 에러가 뜬다. 물론 돋같은 템플릿 특성상 에러메시지는 create_task()가 호출된 코드 위치를 알려주지도 않는다.

1>c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.12.25827\include\ppltasks.h(858): error C2065: ‘_M_asyncInfo’: undeclared identifier

즉 ppl의 create_task()에 UWP API를 넣을수 없다. create_task()를 안쓰고 C++/CX만으로 UWP API를 호출할 방법이 없는건 아닌데 한줄로 될걸 열줄쯤 짜야하니까 미치지.

이거 땜에 한참 시간 낭비했다. 결국 예전 프로젝트 파일과 비교해보고 저 옵션 문제인걸 알았다.
이 미친놈들이 ppl에서 문제 되는건 해결을 먼저 했어야지. 분명히 테스트도 안해봤을거야.
Fucking Microsoft.

하여간 해결책은 간단하다. 프로젝트 세팅에서 ConformanceMode를 no로 설정한다.


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중