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 veren`stdc_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üren`timegm()` 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 `` özniteliği 
** `` özniteliğine benzer ancak fonksiyon çağrılma sırasına bağımlı olan `` ö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