C ++ 23: Modüler standart bir kütüphane ve iki yeni işlev

Adanali

Active member
C ++ 23: Modüler standart bir kütüphane ve iki yeni işlev


  1. C ++ 23: Modüler standart bir kütüphane ve iki yeni işlev

Standart C ++ 23 kütüphanesi etkileyici iyileştirmelerle parlıyor. Bu makalede, standart modüler kütüphaneden ve iki pratik işlevden geçeceğim std::print VE std::println yazmak.
















Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.







Yeni bir dilde her programlama zorluğu “Merhaba Dünya” programı ile başlar. C ++ 98'den bu bizim başlangıç noktamızdı:



#include <iostream>

int main() {

std::cout << "Hello Worldn";

}


Eski alışkanlıklarınızı C ++ 23'te açmalısınız. “Merhaba Dünya” programı şimdi şöyle görünüyor:



import std;

int main() {

std::println("Hello World");

}


Programı analiz etmek istiyorum.



Standart Modüler Kitaplık


C ++ 23, modüler bir standart kütüphaneyi destekler. Basit komutla import std; Standart kütüphanenin tamamı emrinizde. Ayrıca Clobal C gibi işlevler yaparsanız printf kullanmak istiyorsun, yapmalısın import std.compat; kullanmak. İşte ilgili “merhaba dünya” programı printf:



import std.compat;

int main() {

printf("Hello Worldn");

}


Standart modüler kütüphanenin iki önemli gelişimi vardır: önemli ölçüde iyileştirilmiş derleme süresi ve kullanılabilirlik.

Önemli iyileştirme süresi süresi


Standart kütüphanenin içe aktarılması (import std) kelimenin tam anlamıyla “ücretsiz”. Bu, derleme sürelerinin önemli ölçüde azaldığı anlamına gelir. İlk deneyim, derleme sürelerinin en az bir faktör 10 olduğunu göstermektedir. Bu gelişmenin nedeni açıktır. Başlık dosyalarını kademeli olarak eklemek yerine bir form içe aktarın. Bu yüzden tüm standart C ++ 23 kütüphanesini içeren tek bir form var. Şimdiye kadar, yalnızca MSVC derleyicisi bu standart modüler kütüphaneyi destekledi: Eğitim: Standart C ++ kitaplığı, komut satırından modülü kullanarak önemlidir.

Kullanılabilirliğin iyileştirilmesi


Diyelim ki işlevi istiyoruz std::accumulate kullanmak. Hangi başlık dosyasını eklemeniz gerektiğini biliyor musunuz? Başlık dosyasınumeric>,functional> veyaalgorithm>? Belki senin için çok kolaydı. Şimdi göründüğü gibi std::forward Aşağıdaki program neden veya neden tamamlanamıyor?



int main() {

auto list = {1, 2, 3, 4};

}


İfade {1, 2, 3, 4} bir std::initializer_list<int>. Onları kullanmak için başlıkinitializer_list> Kullanılabilir. Tabii ki, bir kap göründüğünde bu başlık otomatik olarak entegre edilir std::vector Kullanılır.

Önceki örnekleri basit bir şekilde karşılaştırın import std; VEYA import std::compat;. Deneyimlerime göre biliyorum: Yeni başlayanlar sadece doğru başlık dosyalarını kullanırken başarısız olmakla kalmaz.

Bunu fark edip etmediğinizi bilmiyorum, ama C ++ 23- “Merhaba Dünya” programım C ++ 23'ün ikinci bir özelliğini kullandı:

std::print VE std::println


C ++ 23, her iki işlev için iki aşırı yük sunar:

std::print



template< class... Args >
void print( std::FILE* stream,
std::format_string<Args...> fmt, Args&&... args );

template< class... Args >
void print( std::format_string<Args...> fmt, Args&&... args );



std::println



template< class... Args >
void println( std::FILE* stream,
std::format_string<Args...> fmt, Args&&... args );

template< class... Args >
void println( std::format_string<Args...> fmt, Args&&... args );


Arasındaki ilk fark std::print VE std::println Açıkçası: std::println Bir satır molası ekleyin. Aşağıdaki noktalar daha da ilginç:

Çeşitli Model


std::print VE std::println Çeşitli modellerdir. Çeşitli modeller, herhangi bir sayıda konuyu alabilen modellerdir. Konularınız mükemmel bir şekilde iletilecektir (mükemmel yönlendirme). std::print VE std::println Bunlar, tür -fafe varyantıdır printf. İLE printf Biçim zilini belirtmelisiniz. std::print VE std::println Yer tutucuları format dizesinde kullanabilirsiniz. Genel olarak, derleyici, yer tutucu için veri türünü kurallardan türetir. std::format C ++ 20'den. Görünüşe göre std::print VE std::println C ++ 20'deki format dizeleri için C ++ 23 Şeker Sözdizimsel. İşte C ++ 23'te değiştirilmiş “Merhaba Dünya” programı, std::format kullanılmış.



import std;

int main() {

// std::println("Hello World");
std::cout << std::format("{:}n", "Hello World");

}


Mükemmel inholy'den en çeşitli modele sahipseniz ve std::formaBilmek istiyorum, en eski makalelerimi oku:

Unicode desteği


O std::print VE std::println C ++ 2 C ++ 20'deki format dizeleri için sözdizimsel şekerde yanlış gibi görünüyor. Neden std::print VE std::println Unicode'u destekleyin. P2093R14 teklifinden bahsetmek istiyorum:

Başka bir sorun, Unicode metninin biçimlendirilmesidir:

std::cout << "Привет, κόσμος!";

Menşe ve yürütme kodlaması UTF-8 ise, bu, GNU/Linux ve macOS üzerinde beklenen çıktıyı üretecektir. Gayri resmi olarak pencerelerde, sistemin Unicode'u tamamen yazdırabilmesine rağmen Mojibake üretilmesi neredeyse garantilidir.

Привет κόσμος!

Visual C ++ kullanılarak /UTF-8 ile tamamlanmış olsa bile ([MSVC-UTF8]). Bunun nedeni, terminalin yürütme kodlamasına bakılmaksızın bu durumda 437 kodunu varsaymasıdır.

Önerilen kartla


std::print("Привет, κόσμος!");

“П п, κόσμος!” Programcıların standart yapıları kullanarak akışta bir metin tek kodu yazmasına izin vermesi beklendiği gibi.

Herhangi bir çıktı akımı


Her iki varyant std::print VE std:println Herhangi bir çıktı akımını kabul eden aşırı yüklemeye sahip olun. Çıktı akımı varsayılan olarak stdout.

std::format Ve bu nedenle std::print VE std::println C ++ 23'te sunacak başkaları var. C ++ 23'te standart model kitaplığın bir kapsayıcıyı biçimlendirmek mümkündür.

Bir konteynerin biçimlendirilmiş sürümü


Aşağıdaki program, doğrudan bir STL kabı üretmenin nasıl mümkün olduğunu göstermektedir. Şimdiye kadar, hiçbir C ++ derleyicisi bu işlevi desteklemedi. Sadece yepyeni klan derleyicisi libc++ Bunun yerine libstdc++ Bu işlevi en azından kısmen kullanmanıza izin verir. Tamamen uyumlu bir C ++ 23 uygulamasında yapabilirim std::println yerine std::format kullanmak.



// formatVector.cpp

#include <format>
#include <iostream>
#include <string>
#include <vector>

int main() {

std::vector<int> myInts{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << std::format("{:}n", myInts);
std::cout << std::format("{::+}n", myInts);
std::cout << std::format("{::02x}n", myInts);
std::cout << std::format("{::b}n", myInts);

std::cout << 'n';

std::vector<std::string> myStrings{"Only", "for", "testing", "purpose"};
std::cout << std::format("{:}n", myStrings);
std::cout << std::format("{::.3}n", myStrings);

}


Bu örnekte bir tane kullanıyorum std::vector<int> ve bir std::vector<std::string>. Eğer {:} Her iki kap (1 ve 2) doğrudan yer tutucu olarak görüntülenir. İki Çift Puan Olun {::} yer tutucu içinde kullanılır, std::vector format. Spesifik format ikinci kolonu takip eder.

  • std::vector<int>: Vektör öğelerinin bir işareti vardır. {::+}Doldurma işareti olarak 0 ile 2 karakter üzerinde onaltılık. {::02x} hizalanmış ve sunuldu ikili {::b}.
  • std::vector<std::string>: Her dize ilk 3 karakterine kısaltılır: {::.3}.
Aşağıdaki ekran görüntüsü, programın Explorer derleyicisinde sürümünü göstermektedir:









Sırada ne var?


C ++ 23'te geliştirilen standart kütüphane hakkındaki bir sonraki makalemde, std::eek:ptional ve yeni veri türü std::expected Hataların tedavisi için mevcut.


(harita)
 
Üst