Trigraflar düştü
Kaynak dosyalar , standartta tanımlanan kaynak karakter kümesine uygulama tanımlı bir şekilde eşlenen fiziksel bir karakter kümesinde kodlanır . Kaynak karakter kümesinin ihtiyaç duyduğu tüm noktalama işaretlerine yerel olarak sahip olmayan bazı fiziksel karakter kümelerinden eşlemeleri barındırmak için, dil tanımlı trigraflar — daha az yaygın bir noktalama karakteri yerine kullanılabilecek üç ortak karakter dizileri. Önişlemci ve derleyicinin bunları ele alması gerekiyordu.
C ++ 17'de trigraflar kaldırıldı. Bu nedenle, bazı kaynak dosyalar, ilk önce fiziksel karakter kümesinden kaynak karakter kümesiyle bire bir eşleyen başka bir fiziksel karakter kümesine çevrilmedikçe yeni derleyiciler tarafından kabul edilmeyecektir. (Uygulamada, çoğu derleyici, trigrafların yorumlanmasını isteğe bağlı yaptı.) Bu, ince bir davranış değişikliği değildir, ancak, önceden kabul edilebilir kaynak dosyaların harici bir çeviri işlemi olmadan derlenmesini engelleyen bir değişikliktir.
Daha fazla kısıtlama char
Standart ayrıca , uygulama tanımlı olan, ancak en azından tüm kaynak karakter setini ve az sayıda kontrol kodunu içermesi gereken yürütme karakter setine atıfta bulunur .
C ++ standardı char
, yürütme karakter kümesindeki her değeri verimli bir şekilde temsil edebilen, muhtemelen işaretsiz bir integral türü olarak tanımlanır . Bir dil avukatının sunumu ile a'nın char
en az 8 bit olması gerektiğini iddia edebilirsiniz .
Uygulamanız için işaretsiz bir değer kullanıyorsa char
, 0 ile 255 arasında değişebileceğini ve bu nedenle olası her bayt değerini depolamak için uygun olduğunu bilirsiniz.
Ancak uygulamanız imzalı bir değer kullanıyorsa, seçenekleri vardır.
Çoğu, ikinin tamamlayıcısını kullanır char
ve minimum -128 ila 127 aralığı verir. Bu 256 benzersiz değerdir.
Ancak başka bir seçenek işaret + büyüklük idi, burada bir bit, sayının negatif olup olmadığını ve diğer yedi bitin büyüklüğü belirtmek için ayrılmıştır. Bu char
, yalnızca 255 benzersiz değer olan -127 ila 127 aralığı verir. (Çünkü -0'ı temsil edecek kullanışlı bir bit kombinasyonunu kaybedersiniz.)
Emin komite şimdiye açıkça bir kusur olarak bu belirlenen değilim ama gelen ring seferi garanti etmek standarda dayanmayan çünkü öyleydi unsigned char
için char
ve tekrar orijinal değerini koruyacak. (Pratikte, tüm uygulamalar bunu yaptı çünkü hepsi imzalı integral türleri için ikinin tamamlayıcısını kullanıyordu.)
Sadece yakın zamanda (C ++ 17?), Gidiş-dönüşü sağlamak için ifade düzeltildi. Bu düzeltme, diğer tüm gereksinimlerle birlikte char
, char
açıkça belirtmeden ikinin tamamlayıcısını etkili bir şekilde zorunlu kılar (standart, diğer işaretli integral türleri için işaret + büyüklük gösterimlerine izin vermeye devam etse bile). Tüm işaretli integral türlerinin ikinin tümlemesini kullanmasını gerektiren bir teklif var, ancak C ++ 20'ye girip girmediğini hatırlamıyorum.
Yani bu, aradığınız şeyin tam tersi çünkü önceden yanlış olan aşırı küstah koda geriye dönük bir düzeltme sağlıyor.