Microsoft MVP성태의 닷넷 이야기
VC++: 130. C++ string의 c_str과 data 함수의 차이점 [링크 복사], [링크+제목 복사],
조회: 22486
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

C++ string의 c_str과 data 함수의 차이점

이에 대해서는 다음의 글에 잘 정리가 되어 있습니다.

string c_str() vs. data()
; https://stackoverflow.com/questions/194634/string-c-str-vs-data

어쨌든 공식적으로는 C++03 이전에는 구현체마다 다를 수 있었지만 C++11부터는 단일하게 null 종료 문자를 가진 유형으로 반환한다고 합니다.

In C++11 onwards, both functions are required to be the same. i.e. data is now required to be null-terminated. According to cppreference: "The returned array is null-terminated, that is, data() and c_str() perform the same function."


그러던 것이 C++17 표준부터는 data()는 "const"를 떼는 것으로 바뀝니다. 그래서 C++11 이전에는 다음의 코드가 문제없이 컴파일되었지만,와 함께,

const char* p1 = txt.data();
const char* p2 = txt.c_str();

"ISO C++17 Standard (/std:c++17)"부터는 data가 const 유형으로 반환하지 않으므로 다음과 같이 바꿔야 합니다.같은 표현도 가능합니다.

// 컴파일 에러 발생 - Error C2440 'initializing': cannot convert from 'const _Elem *' to 'char *'
// const char* p1 = txt.data();

char* p1 = txt.data(); // char* 변수로도 반환 가능
const char* p2 = txt.c_str();




참고로, C++03 이전에는 달랐다고 하는데 구현체마다 그럴 가능성은 있겠지만 대부분은 string이 문자열에 주로 사용되었으므로 동일하게 바뀐 것 같습니다. 예를 들어 Linux g++에서 "C++03 (-std=c++03)" 옵션으로 data(), c_str()의 코드를 보면,

const _CharT*
data() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }

const _CharT*
c_str() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }

동일한 _M_data() 함수를 호출하기 때문에 다른 동작을 할 여지가 없습니다. 혹시나 싶어 Visual Studio 2015의 C++ 프로젝트에서 "Platform target" 설정을 "Visual Studio 2015 - Windows XP (v140_xp)"로 한 경우의 std::string 소스 코드도 살펴봤는데요, 다만 이번에는 다음과 같이 차이점을 설명하는 (오래된) 주석은 확인할 수 있었습니다.

const _Elem *data() const _NOEXCEPT
    {   // return pointer to nonmutable array
    return (this->_Myptr());
    }

const _Elem *c_str() const _NOEXCEPT
    {   // return pointer to null-terminated nonmutable array
    return (this->_Myptr());
    }

그래도 코드 자체는 _Myptr() 함수를 부르는 것으로 동일하게 처리하지만. ^^;




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/20/2019]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2019-05-20 04시37분
[kernel] // 컴파일 에러 발생 - Error C2440 'initializing': cannot convert from 'const _Elem *' to 'char *'
를 발생시킨 소스를 공유해주실 수 있나요? 저 에러메시지는 const* 인 data를 char*에 대입할 때 발생하는 메시지 같은데요...
[guest]
2019-05-20 04시40분
[kernel] 주석처리한 라인이 https://onlinegdb.com/rk9cY0yaE 와 vs2019 /std:c++17 에서 컴파일 에러를 만들지 않았습니다.
[guest]
2019-05-20 11시39분
아... 제가 헷갈렸습니다. 맞습니다. C++17과 그 하위의 버전을 번갈아가면서 테스트하다가 그렇게 꼬였습니다. ^^; 말씀하신 것처럼 C++14 이하 버전에서 const*로 반환하는데 그걸 char* 변수로 받다가 발생한 문제였습니다.
정성태

... 91  92  93  94  95  96  97  98  99  [100]  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11463정성태3/15/201820224.NET Framework: 733. 스레드 간의 read/write 시에도 lock이 필요 없는 경우파일 다운로드1
11462정성태3/14/201823800개발 환경 구성: 354. HTTPS 호출에 대한 TLS 설정 확인하는 방법 [1]
11461정성태3/13/201826153오류 유형: 454. 윈도우 업데이트 설치 오류 - 0x800705b4 [1]
11460정성태3/13/201818256디버깅 기술: 112. windbg - 닷넷 메모리 덤프에서 전역 객체의 내용을 조사하는 방법
11459정성태3/13/201819476오류 유형: 453. Debug Diagnostic Tool에서 mscordacwks.dll을 찾지 못하는 문제
11458정성태2/21/201820429오류 유형: 452. This share requires the obsolete SMB1 protocol, which is unsafe and could expose your system to attack. [1]
11457정성태2/17/201824579.NET Framework: 732. C# - Task.ContinueWith 설명 [1]파일 다운로드1
11456정성태2/17/201830646.NET Framework: 731. C# - await을 Task 타입이 아닌 사용자 정의 타입에 적용하는 방법 [7]파일 다운로드1
11455정성태2/17/201819859오류 유형: 451. ASP.NET Core - An error occurred during the compilation of a resource required to process this request.
11454정성태2/12/201828841기타: 71. 만료된 Office 제품 키를 변경하는 방법
11453정성태1/31/201820617오류 유형: 450. Azure Cloud Services(classic) 배포 시 "Certificate with thumbprint ... doesn't exist." 오류 발생
11452정성태1/31/201826035기타: 70. 재현 가능한 최소한의 예제 프로젝트란? [3]파일 다운로드1
11451정성태1/24/201819887디버깅 기술: 111. windbg - x86 메모리 덤프 분석 시 닷넷 메서드의 호출 인자 값 확인
11450정성태1/24/201836118Windows: 146. PowerShell로 원격 프로세스(EXE, BAT) 실행하는 방법 [1]
11449정성태1/23/201822781오류 유형: 449. 단위 테스트 - Could not load file or assembly 'Microsoft.VisualStudio.QualityTools.VideoRecorderEngine' or one of its dependencies. [1]
11448정성태1/20/201820861오류 유형: 448. Fakes를 포함한 단위 테스트 프로젝트를 빌드 시 CS0619 관련 오류 발생
11447정성태1/20/201822149.NET Framework: 730. dotnet user-secrets 명령어 [2]파일 다운로드1
11446정성태1/20/201822478.NET Framework: 729. windbg로 살펴보는 GC heap의 Segment 구조 [2]파일 다운로드1
11445정성태1/20/201820748.NET Framework: 728. windbg - 눈으로 확인하는 Workstation GC / Server GC
11444정성태1/19/201820313VS.NET IDE: 125. Visual Studio에서 Selenium WebDriver를 이용한 웹 브라우저 단위 테스트 구성파일 다운로드1
11443정성태1/18/201821742VC++: 124. libuv 모듈 살펴 보기
11442정성태1/18/201818784개발 환경 구성: 353. ASP.NET Core 프로젝트의 "Enable unmanaged code debugging" 옵션 켜는 방법
11441정성태1/18/201817248오류 유형: 447. ASP.NET Core 배포 오류 - Ensure that restore has run and that you have included '...' in the TargetFrameworks for your project.
11440정성태1/17/201820542.NET Framework: 727. ASP.NET의 HttpContext.Current 구현에 대응하는 ASP.NET Core의 IHttpContextAccessor/HttpContextAccessor 사용법파일 다운로드1
11439정성태1/17/201826234기타: 69. C# - CPU 100% 부하 주는 프로그램파일 다운로드1
11438정성태1/17/201820140오류 유형: 446. Error CS0234 The type or namespace name 'ITuple' does not exist in the namespace
... 91  92  93  94  95  96  97  98  99  [100]  101  102  103  104  105  ...