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'teOn August 30, 2024 the standard reached ISO development stage "50.20 Proof sent to secretariat or FDIS ballot initiated: 8 weeks" and as of September 19, ISO lists it as having "Publication date : 2024-10".  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
  ve  anahtar sözcükleri eklendi.
 , , ,  ve  anahtar sözcükleri eklendi. Daha önce tanımlanmış olan anahtar sözcükler, yenilerine alternatif olarak kullanılabilecek şekilde bırakıldı: , , , , .
  anahtar sözcüğü eklendi
  ve  anahtar sözcükleri eklendi
  anahtar sözcüğü eklendi
  anahtar sözcüğü eklendi
 , ,  anahtar sözcükleri on tabanındaki kayan noktalı sayı aritmatiğinde isteğe bağlı kullanılabilecek şekilde eklendi

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

Tipler
 Null pointer türü olan  eklendi.
 Bit kesinlikli integer türleri olan  ve  eklendi. Maximum bit genişliğini veren  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ı.
  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 ( gibi) farklı nesnelerin ayni dönüşüm biriminde (translation unit, TU) bulunmasına izin verildi.
 Belli bit genişliğindeki ( ve  gibi) integer değerlerinin 'nin değerini geçebilmesine izin verildi.(N2888).

Sabitler
 nullptr_t türünün bir sabiti olan  eklendi,
  ve  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ş  türleri için  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ı.  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  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. , , , , ve  öznitelikleri C++11 ile uyumluluk için eklendi, sonrasında C11 ile eklenen ,  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.  ile  aynı anlama sahip).
 UTF-8 kodlamasını temsil etmek için karakter literallerine u8 önekinin getirilebilmesi C++17 ile uyumluluk için eklendi.
  ve  ö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  türü eklendi ve u8 karakter değişmezlerinin (constant) ve string literallerinin türü  olarak değiştirildi.
 Başka bir şekilde olması belirtilmediği takdirde, tüm  string ve literal'lerin UTF-16 ve  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  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)

 Kaynakça 

Dış bağlantılar
 C Language WG14 (Working Group 14)
 WG14 Document Repository
 WG14 Meetings - agenda and minutes
 WG14 Charters: C2x Charter, C23 Charter, Interpreting the C23 Charter, C Standard Charter

 Jens Gustedt's Blog: Feature freeze for C23
 The Pasture: C23 is Finished: Here is What is on the Menu
 Daniel Lemire's blog C23: a slightly better C