# C23 (C standart revizyonu)
C23, C programlama dilinin açık standard taslağıdır ve ISO/IEC 9899:2024 olarak yayınlanması ve C17'nin (ISO/IEC 9899:2018) yerini alması beklenmektedir. 2016'da gayriresmi olarak C2x adıyla üzerinde çalışılmaya başlanmıştır ve Ekim 2024'te yayınlanması beklenmektedir. C23'ün en son taslağı 1 Nisan 2023'te yayınlanmıştır ve genel erişime açıktır. WG14 (Working Group 14, 14. Çalışma Grubu) C2x taslağı için ilk olarak Ekim 2019 toplanmış, 2020'te COVID-19 pandemisi nedeniyle toplantılar sanal olarak uzaktan yapılmış, sonrasında telekonferans toplantıları 2024 boyunca devam etmiştir. Haziran 2024'teki açık standardta 'C23'ün bitiminden sonra, "C2y" olarak adlandırıldığı' belirtilmiştir.
C23 ile birlikte __STDC_VERSION__ ön tanımlı makrosunun değeri 201710L'ten, 202311L olarak değiştirilmiştir.


## Özellikler.
C23'ün en son çalışma taslağında değişiklikler aşağıda listelenmiştir.


### Standard Kütüphane.
#### Yeni eklenen fonksiyonlar.
  - Optimizasyonlardan etkilenmeden bellekte saklanan hassas veriyi silen memset_explicit() fonksiyonu <string.h> başlığına eklendi.
  - POSIX ve SVID C uzantılarına benzer şekilde, belli bir baytla karşılaşılana kadar bellek kopyalayan memccpy() fonksiyonu <string.h> başlığına eklendi.
  - POSIX ve SVID C uzantılarına benzer şekilde, bir string'in kopyasını oluşturan strdup() ve strndup() fonksiyonları <string.h> başlığına eklendi.
  - İşaretçinin bellekte hizalanma (alignment) şeklini anlamak için memalignment() fonksiyonu <stdlib.h> başlığına eklendi.
  - Pek çok integer türü için bitlerle ilgili bilgi elde etmek amaçlı fonksiyon / macro ve türler <stdbit.h> başlığına eklendi. Varolan kütüphanelerle isim çakışmasını önlemek için hepsi stdc_ şeklinde öneklendirildi.
   - Aşağıdaki fonksiyonlarda   karakteri, uc, us, ui, ul, ull olarak farkli integer türlerini ifade edecek şekilde 5 fonksiyon adını temsil etmektedir.   olmayacak şekilde jenerik (type-generic) makro olarak da kullanılabilir.
   - Bir değerdeki 1 veya 0 bitlerini saymak için stdc_count_ones () ve stdc_count_zeros () eklendi.
   - En çok değeri oluşturan bit'ten (MSB, most significant bit) itibaren, sırasıyla, yan yana 1 ve 0 sayılarını veren stdc_leading_ones () ve stdc_leading_zeros ().
   - En az değeri oluşturan bit'ten (LSB, most significant bit) itibaren, sırasıyla, sayının başından başlayıp 1 ve 0 bit'lerinin sayılarını veren stdc_trailing_ones () and stdc_trailing_zeros ().
   - En çok değeri oluşturan bit'ten itibaren, sırasıyla, ilk 1 ve 0 bitlerinin pozisyonunu veren stdc_first_leading_one () ve stdc_first_leading_zero ().
   - En az değeri oluşturan bit'ten itibaren, sırasıyla, ilk 1 ve 0 bitlerinin pozisyonunu verenstdc_first_trailing_one () ve stdc_first_trailing_zero ().
   - Bir değerin 2'nin çarpanı olup olmadığına karar vermek için stdc_has_single_bit ().
   - Geçilen değerden büyük veya ona eşit olan 2'nin en büyük tam kuvvetini döndüren stdc_bit_floor ().
   - Geçilen değerden büyük veya ona eşit olan 2'nin en küçük tam kuvvetini döndüren stdc_bit_ceil ().
   - Bir değeri temsil etmek için gerekli bit sayısı için stdc_bit_width ().
  - glibc ve musl kütüphanelerinde bulunan ve verilen zamanı takvim zamanına dönüştürentimegm() fonksiyonu <time.h> başlığına eklendi.


#### Mevcut fonksiyonlara yapılan değişikler.
  - Binary'e (2 tabanında sayıya) dönüşüm belirteci olan %b, printf() fonksiyon ailesine eklendi.
  - Binary dönüşüm belirteci olan %b, scanf() fonksiyon ailesine eklendi.
  - 0b ve 0B binary dönüşüm desteği strtol() ve wcstol() fonksiyon ailesine eklendi.
  - bsearch(), bsearch_s(), memchr(), strchr(), strpbrk(), strrchr(), strstr() fonksiyonları ile bunların genişletilmiş karakter için olaran versiyonları olan wmemchr(), wcschr(), wcspbrk(), wcsrchr(), wcsstr() fonksiyonlarına eğer const nesneler geçildiyse, const nitelenmiş nesne döndürecek şekilde değiştirildi.


### Anahtar sözcükler.
   - YÖNLENDİRME ve  YÖNLENDİRME anahtar sözcükleri eklendi.
   - YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME ve  YÖNLENDİRME anahtar sözcükleri eklendi. Daha önce tanımlanmış olan anahtar sözcükler, yenilerine alternatif olarak kullanılabilecek şekilde bırakıldı:  YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME .
   - YÖNLENDİRME anahtar sözcüğü eklendi
   - YÖNLENDİRME ve  YÖNLENDİRME anahtar sözcükleri eklendi
   - YÖNLENDİRME anahtar sözcüğü eklendi
   - YÖNLENDİRME anahtar sözcüğü eklendi
   - YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME anahtar sözcükleri on tabanındaki kayan noktalı sayı aritmatiğinde isteğe bağlı kullanılabilecek şekilde eklendi


### Önişlemci.
   - YÖNLENDİRME ve  YÖNLENDİRME direktiflerine eşdeğer olan  YÖNLENDİRME ve  YÖNLENDİRME direktifleri eklendi. Her iki direktif de önceden C++23 standardına ve GCC 12'de eklenmişti.
  - Binary kaynak (resource) include etmeye yarayan  YÖNLENDİRME direktifi ile bu kaynağın erişilebilir olup olmadığını önişlemci direktifiyle sorgulamaya yarayan  YÖNLENDİRME eklendi.
  - Derlemede uyarı mesajı vermeye yarayan  YÖNLENDİRME eklendi.
  - Bir başlık dosyasının ulaşılabilir olup olmadığını önişlemci direktifiyle kontrol etmeye yarayan  YÖNLENDİRME eklendi.
  - Bir özniteliğin (attribute) ulaşılabilir olup olmadığını önişlemci direktifiyle kontrol etmeye yarayan  YÖNLENDİRME eklendi.
  - Bir makroya yalnızca değişebilen sayıda (variadic) argüman geçildiğinde genişleyen ve variadic makrolar oluşturmaya yarayan  YÖNLENDİRME fonksiyonel makrosu eklendi.


### Tipler.
  - Null pointer türü olan  YÖNLENDİRME  eklendi.
  - Bit kesinlikli integer türleri olan  YÖNLENDİRME ve  YÖNLENDİRME eklendi. Maximum bit genişliğini veren  YÖNLENDİRME eklendi.
  - Tam sayılar için kontrol edilmiş işlemler sağlayan ckd_add(), ckd_sub(), ckd_mul() jenerik macrolar.
  - Dizi türlerinin fonksiyona dizi boyu bilgisiyle geçilmesine izin verildi (Bu özellik yığın bellekte tahsis edilmiş otomatik saklama sürecinde barındırılan değişken boylu diziler (Variable-length array, VLA) için geçerli değildir).
  - Dizi türleri için daha iyi const desteği.
  - typeof(...) operatörü standardlaştırıldı.
   - YÖNLENDİRME anahtar sözcüğünün anlamı, tür belirleme yapabilecek şekilde geniştildi fakat barındırma sınıfı belirteci şeklindeki önceki anlamı auto bir tür ile birlikte kullanıldığında hala kullanılabilir olacak şekilde korundu. C++'tan farklı olarak C23 tür belirlemesi yalnızca nesne tanımları için geçerlidir, fonksiyon dönüş türü ve paramatresi olarak kullanılamaz.
  - struct, union ve enum türlerinin tanımı ile birlikte yapılan nesne deklerasyonlarında ( YÖNLENDİRME gibi) farklı nesnelerin ayni dönüşüm biriminde (translation unit, TU) bulunmasına izin verildi.
  - Belli bit genişliğindeki ( YÖNLENDİRME ve  YÖNLENDİRME gibi) integer değerlerinin  YÖNLENDİRME 'nin değerini geçebilmesine izin verildi.(N2888).


### Sabitler.
  - nullptr_t türünün bir sabiti olan  YÖNLENDİRME  eklendi,
   - YÖNLENDİRME ve  YÖNLENDİRME türleri için wb ve uwb integer literal sonekleri eklendi,
  - Binary sayı sabiti için 0b ile 0B önekleri eklendi,
  - Sayılarda basamak ayracı olarak kullanılabilen ' eklendi,
  - enum türlerinin temsil ettiği sabitler için ifade ettiği değerlerin türünü belirleme özelliği getirildi,
  - Tuttuğu integer türü belirtilmemiş  YÖNLENDİRME türleri için  YÖNLENDİRME ifade edilemeyen değerlere (INT_MAX'tan büyük ve INT_MIN'den küçük) izin verildi.


### Sözdizim.
  - Etiketlerin (label) bildirimlerden önce ve birleşik deyimlerin (compound statements) sonunda yapılabilmesine izin verildi.
  - Fonksiyon tanımlarında isimsiz parametrelere izin verildi.
  - VLA için de kullanılabilecek olan {} kullanarak sıfır ilk değer ataması
  - Değişken sayıda parametre alabilen (variadic) fonksiyonların ... (ellipsis)'den önce bir isimli argüman belirtilmesi şartı kaldırıldı.  YÖNLENDİRME makrosu artık ikinci bir argumana sahip olmak zorunda veya varsa ilk argümandan sonraki argümanları işlemek (evaluate) zorunda değil.
  - C++11'deki gibi  YÖNLENDİRME kullanan öznitelik (attribute) sözdizimi eklendi. Ek olarak aşağıdaki öznitelikler eklendi:
   - Yalnızca fonksiyon parametrelerine bakarak tekrar aynı sonuçları üretilebileceğini derleyiciye bildiren ve optimizasyonu mümkün kılan unsequenced özniteliği 
   - unsequenced özniteliğine benzer ancak fonksiyon çağrılma sırasına bağımlı olan reproducible özniteliği,
  - C++17 ile uyumluluk amacıyla tek argümanlı _Static_assert eklendi (assert.h).
  - Bir argümana sahip olmayan fonksiyonların parametre listesinde void belirtmesi gerekliliği kaldırıldı (void foo() şeklinde).


### C++ ile uyumluluk.
  - Etiketlerin (label) bildirimlerden önce yapılabilemesi, isimsiz fonksiyon argümanları, {} kullanarak sıfır ilk değer ataması, isimli bir argümana ihtiyaç duymayan değişiken sayıda argüman alabilen (variadic) fonksiyonlar, C++11'deki gibi öznitelik (attribute) sözdizimi, assert.h'ta tanımlanan _Static_assert gibi C++ ile uyumluluğu geliştirme amaçlı çeşitli sözdizimi değişikleri yapıldı. Etiketlerin (label) birleşik deyimlerin (compound statement) sonunda yapılabilmesi ilgili gerekli değişiklikler C++23'te yapıldı.
  - C++-stili öznitelik sözdizimi desteği getirildi.  YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME , ve  YÖNLENDİRME öznitelikleri C++11 ile uyumluluk için eklendi, sonrasında C11 ile eklenen  YÖNLENDİRME ,  YÖNLENDİRME ile <stdnoreturn.h> deprecate edildi. Öznitelik listesinde aynı özniteliğin birden fazla bulunmasına C++23 ile uyumluluk için izin verildi. Tüm standard özniteliklerin ön ve sonuna çift altçizgi eklenerek kullanılabilmesine izin verildi (ör.  YÖNLENDİRME ile  YÖNLENDİRME aynı anlama sahip).
  - UTF-8 kodlamasını temsil etmek için karakter literallerine u8 önekinin getirilebilmesi C++17 ile uyumluluk için eklendi.
   - YÖNLENDİRME ve  YÖNLENDİRME önişlemci direktifleri C++23 ile uyumluluk için eklendi.


### Diğer özellikler.
  - Kayar noktalı (floating point) sayı aritmetiğinin mevcut versiyonu olan ISO/IEC 60559:2020 IEEE 754 standardı için genişletilmiş iki tabanında ve (isteğe bağlı olarak) on tabanında kayar noktalı aritmetik desteği.
  - Nesneler için constexpr belirteci. constexpr nesneler için getirirdi, fakat C++'taki anlamının aksine fonsiyonlar için kullanılabilir değil.
  - UTF-8 ile kodlanmış (encode) veriyi tutmak için  YÖNLENDİRME türü eklendi ve u8 karakter değişmezlerinin (constant) ve string literallerinin türü  YÖNLENDİRME olarak değiştirildi.
  - Başka bir şekilde olması belirtilmediği takdirde, tüm  YÖNLENDİRME string ve literal'lerin UTF-16 ve  YÖNLENDİRME string ve literallerinin UTF-32 olarak kodlanacağı (encode) açıkça belirtildi.
  - Nesne barındırma belirteçlerinin birleşik deyim (compound statement) tanımlarında kullanılabilmesine izin verildi.


## Geçersiz kılınan özellikler.
Bazı eski (obsolete) özellikler C23 çalışma taslağından kaldırıldı veya tavsiye edilmeyen olarak işaretlendi (deprecated).
  - Digraf ve trigraf karakterler kaldırıldı.
  - Fonksiyon argümanları hakkında bilgi sağlamayan K&R fonksiyon tanım ve bildirimleri kaldırıldı.
  - İşaretli tam sayıların ifade edilişinde ikinin tümleyeni dışındaki tüm yöntemler kaldırıldı.
  - Geçerliliğini yitirmiş özellikler olan  YÖNLENDİRME makroları <float.h>'tan kaldırıldı.


## Daha fazlası.
  - N3096 (Resmi C23 standardının basımından önceki son taslak)  WG14  Nisan 2023. "(free download)"
  - N3149 (C23 standardı üzerinde çalışılan taslak)  WG14  July 2023. "(not available to public)"
  - N3219 (ISO/IEC 9899:2023 DIS Draft)  WG14  Şubat 2024. "(ISO draft available but not free)"
  - ISO/IEC 9899:2024 (resmi C23 standardı)  ISO  2024. "(2024'te yayınlanması planlanıyor)"
  - N3220 (first working draft after C23  differs from draft standard N3219 only in one footnote)  WG14  February 2024. "(free download)"