Bawiłem się std::string_view
biblioteką i zastanawiałem się nad zmianą bazy kodu, nad którą pracowałem std::string_view
tak często, jak to możliwe. Jednak w wielu wątkach, które przeczytałem na temat tego, kiedy i gdzie użyć std::string_view
zamiast const std::string &
. Widziałem wiele odpowiedzi mówiących: „Kiedy nie potrzebujesz łańcucha zakończonego znakiem zerowym”. Kiedy zacząłem szukać w Internecie, „kiedy potrzebujesz łańcucha zakończonego znakiem zerowym?” Tak naprawdę nie spotkałem żadnych pomocnych odpowiedzi na ten temat.
Mogę wymyślić przykład zewnętrznej biblioteki, do której link będzie się wymagał std::string
. W takim przypadku potrzebujesz łańcucha zakończonego znakiem zerowym, ponieważ biblioteka tego wymaga. Wydaje mi się, że innym przykładem byłaby potrzeba modyfikacji samego łańcucha, ale nie przepuszczalibyśmy go const &
, gdybyśmy musieli go zmodyfikować.
Kiedy więc miałbyś użyć łańcucha zakończonego zerą?
Linki, na które spojrzałem:
źródło
const char*
argument. Odpowiedź eeroriki ma przykład.Odpowiedzi:
Potrzebujesz łańcucha zakończonego znakiem NULL, ilekroć używany interfejs API mówi, że jest potrzebny. To wymaganie jest wszechobecne w interfejsach C i nie jest wyraźnie określone w niektórych dokumentach. Jeśli argumentem funkcji jest
char*
(być może const) i nie ma argumentu długości, należy przyjąć wymaganie, chyba że dokumentacja mówi inaczej.Weźmy na przykład funkcję
execve
(ze standardu POSIX):Jeśli przekażesz argument zakończony wartością inną niż null jako
pathname
, zachowanie twojego programu będzie niezdefiniowane.źródło
std::string
miałaby to być , byłaby wykonywana jakexecve(pathname.c_str(),...,...)
?Jest to dość łatwe do poznania. Jeśli wywołujesz funkcję, która po prostu pobiera łańcuch c (
char*
/const char*
), potrzebujesz łańcucha zakończonego znakiem null, ponieważ jest to jedyny sposób, aby dowiedzieć się, gdzie jest koniec łańcucha.Jeśli zamiast tego masz funkcję, która przyjmuje rozmiar plus
char*
/const char*
lub tylko dwa wskaźniki oznaczające początek i koniec danych, nie potrzebujesz łańcucha zakończonego znakiem null, ponieważ masz / możesz uzyskać rozmiar łańcucha bez iteracji do terminator zerowy.źródło