VS2013에서 VS2019 마이그레이션 오류

poiq1의 이미지

안녕하세요.
소스 코드 마이그레이션 중에 오류가 있어서 어떻게 처리해야 할지 고민입니다.

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'을(를) 찾을 수 없습니다.

저런 구문이 많기 때문에 일일이 수정하기에는 많은 시간이 걸립니다.
좋은 방법이 없을까요???

미리 감사드립니다.(__)

익명 사용자의 이미지

macro 앞 뒤로 space 를 넣어 보세요.

printf("count:%" SIZE_T "\r\n", count);
poiq1의 이미지

와~ 감사합니다.
그런데 코드를 수정하기에는 저런 형식의 문법이 너무 많네요... 크흡..T^T

익명 사용자의 이미지

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 같은 걸로 서식을 정리해 주면 끝?

poiq1의 이미지

자세한 답변 감사합니다.
속성을 보니 C++ 언어 표준이 있네요!
그런데 기본이 C++14 이고 17까지 설정할 수 있네요.
그 하위로는 지원하지 않나 봅니다.
그런데 플랫폼 도구 집합을 2019에서 2013으로 내리니 적용이 되네요. ㅎㅎ;

Hyun의 이미지

c++ 어렵네요...
ㅡ,.ㅡ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.