C++ (11)는 도입 윈도우 파일 경로, 정규식 표현 등과 같은 특수 기호를 많이 인용 된 문자열 리터럴을 표현하는 것이 매우 유용 할 수 raw string literals ...원시 문자열 리터럴 및 파일 목록 화는
std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline!
std::string quoted = R"("quoted string")";
std::string expression = R"([\w]+[ ]+)";
auto message = R"(Pick up a card)"; // raw string 1
auto cards = R"()"; // raw string 2
이 원시 문자열 리터럴도 더 인코딩 접두사가 지정되지 않은 인코딩 접두사 (
u8
,
u
,
U
, 또는
L
), 그러나,와 결합 될 수있다, 나는이 코드를 가지고 있다고 가정하자?, 파일 인코딩 문제를 않습니다 ,
내가 작성하고, 위의 코드를 저장할 수있는 경우 명백한 내 소스 코드를 유니 코드로 인코딩됩니다, 그래서 궁금하네요 것을 :
raw string 1
리터럴 유니 코드 것입니까? (ASCII 문자 만 사용함), 즉 원시 문자열은 파일의 코드화를 상속합니까? 아니면 컴파일러는 파일 인코딩에 관계없이 유니 코드가 필요하지 않다고 자동 감지합니까?raw string 2
의 인코딩 접두어U
이 유니 코드 리터럴로 처리 되려면 필요하며 그렇지 않으면 내용 및/또는 소스 파일 인코딩으로 인해 유니 코드가 자동으로 필요합니까?
감사합니다.
template<typename T> std::string demangle(T t)
{
int status;
char *const name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
std::string result(name);
free(name);
return result;
}
int main()
{
auto message = R"(Pick up a card)";
auto cards = R"()";
std::cout
<< "message type: " << demangle(message) << '\n'
<< "cards type: " << demangle(cards) << '\n';
return 0;
}
출력 :
message type: char const*
EDIT : 코드 위에서 ideone.com 및
message
및cards
변수 분해 해제 형 인쇄, 그것이 출력char const*
테스트
내가 생각했던 것보다 훨씬 가장 이상한
cards type: char const*
, 나는 유형이 wchar_t
(심지어 L
접두사없이)이 될 것이라고 확신했다.
표준의이 부분은 매우 어둡습니다. GCC와 MSVC에서 문자열은 따옴표 사이의 바이트가 될 것이라고 생각합니다. – Simple
@Simple "* 문자열은 따옴표 사이의 바이트가됩니다 *"그래서 ... 이것은 소스 파일 인코딩을 암시합니다 : O –