Haftalık C++ 52 – İç içe isim uzayları, mesajsız static_assert, __has_include

Evet arkadaşlar, bu hafta da C++ 17 ile işimizi kolaylaştıracak birden fazla kabiliyete hızlıca değiniyor olacağım.
Malum, C++ 20 çıktı, C++ 23 de yolda, bir an önce onlara yetişiyor olmamız lazım 🙂 İlaveten, uEngine de fırından çıktı o çocuğa ilişkin de yazacaklarımız olacak elbette.
Şimdi gelin, değineceğimiz kabiliyetlere bir göz atalım:

  • nested namespaces
  • using ile birden fazla tipin dahil edilmesi
  • Mesaj içermeyen static_assert
  • __has_include

Gördüğünüz üzere, oldukça fazla kalem var ama açıkçası çok da karmaşık olmadıkları için kısaca bilgiler verip geçiyor olacağız. Detaylandırmamı istediğiniz kabiliyet olursa, her zaman yorumlarda belirtebilirsiniz.

Nested Namespaces

Evet, iç içe isim uzayları olarak nitelendirebileceğimiz bu kabiliyet isminde de anlaşılacağı üzere daha kolay ve okunabilir bir şekilde, isim uzaylarını tanımlamanıza olanak sağlamakta. Hemen bir örnek ile daha yakından bakalım. C++ 17 öncesinde, iç içe isim uzaylarını aşağıdaki gibi tanımlamanız gerekmekteydi (elbette kabiliyeti göstermek için örneği biraz zorladım):

bunu artık

diyerek de tanımlayabileceksiniz.

Bu yaklaşıma ilişkin öneriye ve detaylarına https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4026.html adresinden ulaşabilirsiniz. Bunun sıkıntısına ve C++ 17 öncesinde nasıl çözümler geliştirildiğine göz atmak için https://seanmiddleditch.github.io/unnest-c-namespaces/ sayfasına göz atabilirsiniz.

Her ne kadar genel olarak olumlu kabul görse de, https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0816r0.pdf gibi yaklaşımlar da mevcut.

Ben açıkçası, tanımlama açısından kolaylık getireceği kanısındayım.

using ile birden fazla tanım ile kullanımı

C++ 17 öncesinde using ile bir tane tipi dahil etmeye yönelik deklerasyon yapabiliyordunuz ama C++ 17 ile aynı anda birden fazla tip tanımının kullanım da mümkün olabilmekte. Hemen bir örnek ile inceleyelim:

Mesaj içermeyen static_assert:

static_assert, sizlere derleme zamanında bir takım uyumsuzluklar hakkında bilgilendirmek için kullanılabilecek ve C++ 11 ile dile kazandırılan bir kabiliyetti. Bu kabiliyet ile birlikte, verilen bir boolean (derleme zamanında hesaplanabilecek) değerlendirme ışığında hata mesajı verilmekteydi. Örneğin 32Bit derleyici ile kodun derlendiğinden emin olmak için aşağıdaki gibi kod parçası ekleyip, ilgili kodu 64 Bit derleyici de derlediğinizde:

gibi bir hata alırsınız. C++ 17 ile birlikte, static_assert’in ikinci parametresine ihtiyaç kalmadı. Şöyle ki, aşağıdaki gibi bir kullanım da artık mümkün:

Bu durumda alacağınız hata ise, aşağıdaki gibi olacak:

__has_include

C++ 17 ile gelen bir diğer kabiliyet, özellikle, çoklu platformlar için yazılım geliştirenlerin işini kolaylaştıracak nitelikte. Ama şunu da söylemem gerekiyor ki, bu kabiliyet ile sunulan şeyleri başka mekanizmalar ile de yapabiliyorduk fakat bu biraz daha temiz ve tanımlı yol sunmakta. Hemen referans sayfasında (ve öneride olan https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0061r1.html) bulunan, std::optional ile ilgili örneğe bir bakalım. Bu örnekte, ilgili başlık dosyasının olup/olmamasına göre, kullanılan optional dosyası değiştirilmekte:

Ayrıca, https://www.cppstories.com/2019/07/hasinclude/ sayfasında, özellikle benim de daha önce OpenGL uygulaması geliştirirken başvurduğum ve sıkıntı yaşadığım bir konuya nasıl çözüm getirdiğini göstermiş. Bazı platformlar için, OpenGL başlık dosyalarının bulunduğu dizinler değişiklik gösterebilmekte. Bu sebeple, birden fazla platforma hitap eden kütüphaneler geliştirirken bu hususa dikkat etmeniz gerekiyor. Ör. aşağıdaki kodta APPLE için nasıl bir yol izlendiği gösterilmiş:

burada açık bir şekilde __APPLE__ makrosuna atıf var. __has_include ile bu kod parçası aşağıdaki gibi yazılabiliyor ve bu sayede sadece APPLE değil benzer kullanıma sahip bütün platformları da kotarmış oluyoruz.

Evet sevgili yazılımperver dostlarım bir C++ yazımın daha sonuna geldik. Bir sonraki yazımda görüşmek dileğiyle, bol kodlu günler 🙂

Kaynaklar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.