VS2013에서 VS2019 마이그레이션 오류
글쓴이: poiq1 / 작성시간: 화, 2020/11/24 - 3:59오후
안녕하세요.
소스 코드 마이그레이션 중에 오류가 있어서 어떻게 처리해야 할지 고민입니다.
VS2013 코드
#define SIZE_T "d" int main() { int count = 10; printf("count:%"SIZE_T"\r\n", count); return 0; }
코드가 조금 이상하긴 하지만, 2013버전에서는 경고도 없이 잘 넘어갑니다.
그런데 2019버전에서는 printf문에서 오류가 발생합니다.
SIZE_T에 대하여
E2486 사용자 정의 리터럴 연산자가 없습니다.
C3688 잘못된 리터럴 접두사 'SIZE_T'입니다. 리터럴 연산자 또는 리터럴 연산자 템플릿 '연산자 ""SIZE_T'을(를) 찾을 수 없습니다.
저런 구문이 많기 때문에 일일이 수정하기에는 많은 시간이 걸립니다.
좋은 방법이 없을까요???
미리 감사드립니다.(__)
Forums:
macro 앞 뒤로 space 를 넣어 보세요.
macro 앞 뒤로 space 를 넣어 보세요.
와~ 감사합니다.
와~ 감사합니다.
그런데 코드를 수정하기에는 저런 형식의 문법이 너무 많네요... 크흡..T^T
C++11에서 추가된 User-defined
C++11에서 추가된 User-defined literals이 C++의 소스 코드 호환성을 깨트려서 생긴 문제입니다.
구체적으로 말하면, 컴파일 단계에서 소스 코드를 preprocessing tokens으로 쪼개는 step이 preprocessing step보다 앞서는데, 여기서 preprocessing tokens에 User-defined literals이 포함된 것이죠.
그 결과, SIZE_T는 더 이상 매크로 치환의 대상인 identifier가 아니라, user-defined literals의 일부로 분류된 겁니다.
====
즉 제시된 코드는 C++11부터는 유효한 코드로 컴파일 될 수 없습니다.
저는 VS2019를 안 써 봐서 모릅니다만, 혹시 C++11 이전 표준으로 컴파일할 수 있는 옵션이 있는지 찾아보시는 게 좋겠습니다.
그런 기능이 있을 법 한데요.
만약 VS2019에 그런 기능이 없거나, 주어진 코드를 곧 죽어도 C++11 혹은 그 이후 표준으로 컴파일해야만 한다면, 별 수 없이 코드를 고쳐야지요.
해당 작업을 자동으로 해 주는 도구가 있는지는 잘 모르겠습니다. 설령 없다고 해도, 어떻게든 자동화시키는 게 아주 어려울 것 같지는 않은데요.
예컨대,
1. C++03 문법의 preprocessing tokens lexer를 어디서 가져오거나 직접 구현하고
2. 각 token을 공백 문자로 구분하여 고스란히 출력하게 만들면 되겠죠.
3. 그렇게 나온 결과물을 clang-format 같은 걸로 서식을 정리해 주면 끝?
자세한 답변 감사합니다.
자세한 답변 감사합니다.
속성을 보니 C++ 언어 표준이 있네요!
그런데 기본이 C++14 이고 17까지 설정할 수 있네요.
그 하위로는 지원하지 않나 봅니다.
그런데 플랫폼 도구 집합을 2019에서 2013으로 내리니 적용이 되네요. ㅎㅎ;
c++ 어렵네요... ㅡ,.ㅡ
c++ 어렵네요...
ㅡ,.ㅡ
댓글 달기