읽기 전용 시나리오에서 언제 널 종료 문자열이 필요합니까?


10

나는 std::string_view도서관 에서 놀고 있었고 std::string_view가능한 한 많이 사용하기 위해 노력하고있는 코드베이스를 변경하려고 생각 하고 있습니다. 그러나 내가 std::string_view대신에 언제 어디에서 사용 해야하는지에 관해 읽은 많은 스레드 에서 const std::string &. "널 종료 문자열이 필요하지 않을 때"라는 많은 답변을 보았습니다. 웹에서 검색을 시작하면서 "널 종료 문자열이 언제 필요합니까?" 나는 그 주제에 대해 도움이되는 답변을 실제로 보지 못했습니다.

연결할 외부 라이브러리의 예를 생각할 수 있습니다 std::string. 이 경우 라이브러리에 필요하므로 널 종료 문자열이 필요합니다. 문자열 자체를 수정 해야하는 경우 또 다른 예가 될 것이라고 생각하지만 수정 해야하는 경우 전달하지 않습니다 const &.

언제 널 종료 문자열을 사용해야합니까?

내가 본 링크 :

  1. const std :: string &보다 std :: string_view가 얼마나 빠릅니까?
  2. std :: string_view 대신 const & std :: string을 언제 전달합니까?
  3. 왜 문자열보기입니까?
  4. C ++ 17에서 const std :: string & 인수를 사용하는 것이 의미가 있습니까?

5
주로 C API와 인터페이스합니다.
호두

@uneven_mark 하나의 예를 제공 할 수 있습니까?
Sailanarmo

링크 한 네 번째 질문에 대한 답변은이 질문에 대한 답변 인 것 같습니다.
François Andrieux

1
@Sailanarmo POSIX 또는 다른 C 라이브러리의 대부분의 함수는 const char*인수를 취합니다 . eerorika의 anwer가 그 예입니다.
호두

1
@ FrançoisAndrieux의 답은 "API가 null로 끝나는 문자열을 호출하지 않는 한?"입니다.
Sailanarmo

답변:


10

언제 널 종료 문자열이 필요합니까?

사용하는 API가 필요할 때마다 널 종료 문자열이 필요합니다. 이 요구 사항은 C 인터페이스에서 어디에나 존재하며 일부 설명서에는 명시 적으로 언급되어 있지 않습니다. 함수 인수가 char*const 일 수 있고 length 인수가없는 경우 문서에서 달리 명시하지 않는 한 요구 사항을 가정해야합니다.

execvePOSIX 표준 의 기능을 예로 들어 보겠습니다.

int execve(const char *pathname, char *const argv[], char *const envp[]);

로 null이 아닌 종료 인수를 전달하면 pathname프로그램의 동작이 정의되지 않습니다.


따라서이 경우 경로 이름은 다음 std::string과 같이 실행됩니다 execve(pathname.c_str(),...,...).
Sailanarmo

6

실제로 알기는 쉽습니다. c- 문자열 ( char*/ const char*)을 취하는 함수를 호출하는 경우 문자열의 끝이 어디에 있는지 알 수있는 유일한 방법이므로 null로 끝나는 문자열이 필요합니다.

대신 char*/ const char*더하기 크기 를 취하는 함수가 있거나 데이터의 시작과 끝을 표시하는 두 개의 포인터 만 있으면 문자열을 반복하지 않고도 문자열 크기를 얻을 수 있으므로 null로 끝나는 문자열이 필요하지 않습니다. 널 종료 자.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.