Salt okunur bir senaryoda boş bir sonlandırılmış dizeye ne zaman ihtiyacınız vardır?


10

std::string_viewKütüphane ile oynuyorum ve std::string_viewmümkün olduğunca kullanmak için üzerinde çalıştığım bir kod tabanı değiştirmeyi düşünüyorum . Ancak, iş parçacığı birçoğunda ben kullanmaya ne zaman ve nerede konusunda okuduğunuzu std::string_viewyerine const std::string &. Pek çok cevap gördüm, "Eğer boş bir sonlandırılmış dizgeye ihtiyacınız olmadığında." Web'de arama yapmaya başladığımda, "ne zaman bir boş sonlandırılmış dizgeye ihtiyacınız var?" Konuyla ilgili hiçbir yararlı yanıta rastlamadım.

Bağlanacağınız bir dış kütüphane örneğini düşünebilirim std::string. Ve bu durumda, bu kitaplığın gerektirdiği için boş bir sonlandırılmış dizeye ihtiyacınız olacaktır. Sanırım başka bir örnek dize kendisi değiştirmek gerekiyorsa, ama sonra biz const &değiştirmek gerekirse biz bunu geçmek olmaz .

Peki ne zaman boş bir sonlandırılmış dize kullanmanız gerekir?

Baktığım bağlantılar:

  1. Std :: string_view tam olarak nasıl const std :: string & 'den daha hızlıdır?
  2. Ne zaman std :: string_view yerine const & std :: string iletirim?
  3. Neden sadece dize görünümü?
  4. C ++ 17'de const std :: string & argümanlarını kullanmanın bir anlamı var mı?

5
Çoğunlukla C API'leriyle arayüz oluşturmak için.
ceviz

@uneven_mark bir örnek verebilir misiniz?
Sailanarmo

Bağladığınız dördüncü soruya kabul edilen cevap, bu soruya cevap veriyor gibi görünüyor.
François Andrieux

1
@Sailanarmo POSIX veya diğer herhangi bir C kitaplığındaki işlevlerin çoğu const char*argüman alır. eerorika'nın anwer'ın bir örneği var.
ceviz

1
@ FrançoisAndrieux gerçekten cevap, "API boş bir sonlandırılmış dize gerektirmediği sürece?"
Sailanarmo

Yanıtlar:


10

Ne zaman boş bir sonlandırılmış dizeye ihtiyacınız var?

Kullandığınız API buna ihtiyacınız olduğunu söylediğinde, boş bir sonlandırılmış dizeye ihtiyacınız vardır. Bu gereksinim C arabirimlerinde her yerde bulunur ve bazı belgelerde açıkça belirtilmemiştir. Bir işlev bağımsız değişkeni bir char*(muhtemelen sabit) ise ve uzunluk bağımsız değişkeni yoksa, belgeler aksini belirtmedikçe gereksinimi üstlenmelisiniz.

execveÖrnek olarak (POSIX standardından) işlevi ele alalım:

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

Boş olmayan sonlandırılmış bir bağımsız değişken olarak pathnameşöyle iletirseniz, programınızın davranışı tanımsız olur.


Peki bu durumda, yol adı, bir std::stringgibi execve(pathname.c_str(),...,...)mi yürütülecekti ?
Sailanarmo

6

Aslında bunu bilmek oldukça kolay. Eğer sadece bir c-string ( char*/ const char*) alan bir fonksiyon çağırıyorsanız , o zaman dizenin sonunun nerede olduğunu bilmenin tek yolu olarak boş bir sonlandırılmış dizeye ihtiyacınız vardır.

Bunun yerine, a char*/ const char*plus boyutunu alan bir işleve veya verilerin başlangıcını ve sonunu işaretleyen yalnızca iki işaretçiniz varsa, dize boyutunu bir null sonlandırıcı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.