2019년 2월 23일 토요일

[C++] 문장 따옴표 앞의 R

-
일단, 여기에서 봤다.
http://www.cplusplus.com/doc/tutorial/introduction/codeblocks/

여기의 테스트용 간단한 예제 프로그램에 아래와 같이 적혀 있었다.

#include <iostream>
int main()
{
  auto x = R"(Hello world!)";
  std::cout << x;
}

문장 큰 따옴표 앞의 R 이것이 무엇인고?
_( 검색:    R before " in C++  )_ 했다.
https://stackoverflow.com/questions/34988122/is-the-r-before-string-cross-platform

C++11 이후부터 표준화 되어서 도입된 날것(Raw) 그대로의 문장을 지정하는 것이란다.
https://en.cppreference.com/w/cpp/language/string_literal

이것이 가진 효과는 ? 아래의 프로그램을 참고하자. x 는 R 이 붙은 것이고, y 는 R 이 없는 것이다.
그리고, R이 붙은 것에는 따옴표 안에 괄호들이 하나씩 있어야 한다는 것이다. 따옴표 내부의 따옴표에 붙은 괄호는 문자열에서는 없어진다.
R이 붙지 않은 것에는 따옴표 내부의 괄호들이 출력된다.


#include <iostream>

int main()
{
    auto x = R"(Hello world!\n \r my world\nhello. my work!)";
    auto y = "(Hello world!\n \r my world\nhello. my work!)";
    std::cout << x;  std::cout << x;
  std::cout << x;
  std::cout << y;
  std::cout << y;
  std::cout << y;
// 한글일 때에는 ....ㅇㅇㅇㅇㅇ...    알수가 없다.
// 어떤 것이 있는가
//     std::c
}

실행 결과는 다음과 같다.
.... 라고 하려다가, 호기롭게 했지만, 역시나, 내가 linux에 적응하지 못하는 부류인 관계로, linux/unix 터미널 창 제어를 못해서... 결과를 복사하지 못했다... Code::Block 환경 내에서는 실행이 잘 되는데, 왜 나는 할 수 없지?  sudo 등등을 써 봐도, ./(실행파일_이름) 등등 내가 예전에 알고 있던 별 수를 다 써 봐도 안되고.. 실행 파일이 없다는 황당한 메시지만 받고, ls 명령을 해 보면 현재 디렉토리에 분명히 실행권한이 있는 파일이 존재하는데, 실행하려고 하면 없다고...
역시 나는 ...  이런 모든 것을 만든 분들이 위대해 보일 따름이다.

결국 설명은... R이 따옴표 앞에 붙으면, 보통-괄호(중간-괄호 또는 대괄호가 아닌..) _가  따옴표 바로 내부에 붙어야 한다. 그럼, 괄호 자신과 큰 따옴표도 들어갈 수 있다는 것이겠지...
하여간 그러면, \r, \n 이것들이 모두 해석되어서 CR(Carriage Return) 동작이라든가 NL(New Line)동작으로 작동하는 것이 아닌, 그냥 화면에 소스코드에 나온 그대로 \r   로 표시되고, \n  으로 표시된다. \ 문자(back slash)의 C/C++ 언어에서의 특수 해석이 작동하지 않는다는 것이다.
반면에, R이 없는 경우에는 \r 은 커서를 줄의 첫 자리로 옮기고, \n 은 줄을 바꾸는 기능으로 변환해석되어서 작동한다.

조금만 더 예를 들면,
x = R"Hello(Hello( (my ("") \r \n one))Hello";
였다면, x가 출력될 때에는
Hello(my ("") \r \n one)
이 출력되는 것이다. 표현하고 싶은 문자열을 감싸는 경계표시는 시작부분이
R"Hello(     로 시작되고, )Hello"   로 끝나고 이 경계표시는 실제 문자열에는 포함되지 않는다. 이 처음 괄호가 시작되기 전에 들어가는 경계표시 문자열에는 공백문자(스페이스)가 들어가면 안된다.
-
-

댓글 없음: