C ++ 'da tanımlayıcılarda evrensel karakter adlarının kullanımı nedir


11

C ++ standardı (yenisinde fark ettim, ancak C ++ 03'te zaten mevcuttu) \uNNNNve olarak yazılan ve \UNNNNNNNNunicode kod noktaları NNNN/ ile karakterleri temsil eden evrensel karakter adlarını belirtir NNNNNNNN. Bu, dizgi değişmezleri için kullanışlıdır, özellikle de açıkça UTF-8, UTF-16 ve UCS-4 dizgi değişmezleri de tanımlandığından. Bununla birlikte, tanımlayıcılarda evrensel karakter değişmezlerine de izin verilir. Bunun arkasındaki motivasyon nedir?

Sözdizimi açıkça okunamıyor, tanımlayıcılar bağlayıcı için karıştırılabilir ve yine de sembolleri ada göre almak için herhangi bir standart işlev olmadığı gibi değildir. Öyleyse neden herkes içinde evrensel karakter değişmezleri olan bir tanımlayıcı kullansın?

Düzenleme: Aslında C ++ 03 zaten var olduğundan, ek soru aslında kullanılan bir kod gördünüz mü?

Yanıtlar:


6

GÜNCELLEME - bu cevap, bana ve başkalarına mantıklı gelse de, büyük ölçüde yanlış olduğu ortaya çıkıyor (ve niyetle ilgili olarak yeterince yanlış olduğu için yeterince yanlış). (AProgrammer tarafından bir açıklama gibi sivri dışarı) beri var değil aynı karakter temel karakter setinde normalde temsil edilebileceğini zaman dize sabitleri UCS dışında kullanmalarına izin. Yani, hayır benim örnekte olduğu gibi anahtar kelimeler kaçmak için kullanarak; ve hayır kullanarak 23skiddokaçmak gibi 'tanımlayıcılar' yapmak için2. Yine de, adları harici dillerle uyumlu hale getirmek için kullanılabilir, ancak sadece, bu adlar bir harfle veya genişletilmiş bir karakterle başladığında ve yalnızca harfler, rakamlar, alt çizgi ve genişletilmiş karakterler içerdiğinde görünüyor - ki bu amacı uygun şekilde destekleyemeyecek kadar kısıtlayıcı görünüyor. Bu nedenle, ana niyetin (AProgrammer'ın cevabında olduğu gibi) tanımlayıcılarda bu ekstra karakterlere izin vermek ve bu karakterlerin grafiksel olarak görüntülendiği kaynak editörlerin grafik ASVII'de olmasına izin vermek olmalıdır.


C ++ programları diğer dillerde yazılmış işlevleri çağırabilir. Standardizasyon komitesinin C ++ 'ın, bu diller henüz mevcut olmasa bile, işlev adlarında alfasayısal olmayan veya unicode karakterlere izin verebilecek diğer dillerle birlikte çalışabilmesini sağlamak iyi bir stratejidir. Standardın, bunun bağlayıcı düzeyinde nasıl çalışacağını belirtmesi gerekmez; ancak buna izin vermek için belirlenmiş bir mekanizmaya sahip olmak iyidir.

Bunun bir kullanımını görmek için geleceğe bakmanıza gerek yok. Diyelim ki içinde eski bir C kütüphanesi var catch(ya da korumalı ya da değişebilir) ... ve C ++ 'dan çağırmak istiyorum. Ve herhangi bir nedenle C kodunu değiştirmek istemiyorum veya istemiyorum (Bu arada, bir kereden fazla C ++ anahtar kelimesi haline gelmiş bir işlev adı kullanan eski C koduyla uğraşmak zorunda kaldım ...)

UC isimleri ile bunu bir başlığa yazabilir ve sadece 'catch_func ()' diyebilirim:

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

Tabii çirkin, ama başlıkta sadece bir yerde olduğu için önemli değil. Aynı yaklaşım, diğer dillerdeki işlevleri çağırmak için taslaklar yapmak için kullanılabilir ve adlar C ++ anahtar sözcükleri veya unicode olsa veya boşluklar .veya bunlara gömülü başka noktalama işaretleri olsa bile işe yarar

Diğer çeşitli dillerde, genel paterni takip etmeyen tanımlayıcıların oluşturulmasına izin veren cihazlar vardır; Verilog, örnek olarak, \abcdbir tanımlayıcı eşdeğerdir abcdancak \whileve \23skidoove \44.e2bu şekilde görülen ters eğik önek gerek çok tanımlayıcıları vardır. Verilog'un kullanım şekli nedeniyle, dış arabirimlerle ilgili oldukları herhangi bir isme izin vermek önemlidir.


İlginç kullanım durumu. Ben (mümkünse) adını çevirmek için küçük bir C dosyası yazmak (ve böylece C ++ tanımlayıcı kullanabilirsiniz) ve C ++ çağrı C işlevi var daha güzel olurdu.
Thomas Eding

1
İki nedenden ötürü, dize ve karakter değişmezleri dışındaki ilk UCS'nin programı yanlış biçimlendirmeden temel kümelerdeki karaktere işaret edemediğini, ikincisi bu madde yoksa UCS'nin çevirinin 1. aşamasında işlendiğini ve bu nedenle, temel kümedeki bir karaktere ve karakterin kendisine atıfta bulunan bir UCS arasında işlemede fark olmayacaktır.
AProgrammer

4

Tanımlayıcıdaki unicode karakterlerin, kaynağı standart uyumlu derleyicilerde derlenebilir bir biçimde dışa aktarmasına izin veren bir sisteme izin verir. IE bu temel karakter kümesi üzerinden unicode kodlamak için bir yoludur (az ya da çok benzer alıntı yapılabilir gibi e-posta için kullanılır, daha iyi bilen sistemler daha iyi bir iş yapabiliyor, diğer sistemler hala çalışıyor).


2

Birisi, klavyede veya giriş cihazında bulunmayan bir yabancı dil karakteri kullanarak bir tanımlayıcı oluşturmak isteyebilir. Alternatif olarak, tanımlayıcı aygıtın yazı tipi veya çıktı özellikleri kullanılarak yazdırılamayan bir karakter içerebilir, ancak IDE doğru bir gösterim göstermek istiyor.


4
İlk durumda, tanımlayıcı bu karaktere sahip gibi görünmez, bu nedenle kod okunamaz olur ve tanımlayıcı makine için gerçekten önemli değildir. İkincisi, IDE'deki temsil tamamen ayrı bir sorundur.
Jan Hudec

1

C ++, tam anlamıyla kaynakta görünen gerçek genişletilmiş karakterlerin Evrensel Karakter Adları ile aynı şekilde davranmasını gerektirir. Tanımlayıcılarda Evrensel Karakter Adlarına izin verilmesi, programcıların tanımlayıcılarda genişletilmiş karakterler kullanmasına izin verir.


Gerçek genişletilmiş karakterler desteklenir, karşılık gelen evrensel karakterler gibi davranmaları gerekir. Ancak desteklenmeleri gerekmez.
Jan Hudec

1
Bu doğru ama bir nevi noktayı kaçırıyor, yani eğer komite genişletilmiş karakterleri destekleyen uygulamaların tanımlayıcılarda bu karakterleri kullanmayı desteklemesi gerektiğini belirtiyorsa, tanımlayıcılarda UCN'lere izin verilmesini gerektirir. Yani UCN'lere tanımlayıcılarda izin verilir, çünkü bu çok okunabilir olduğundan ve herkes adları onaltılık olarak manuel olarak kodlamayı sever, ancak eğer spesifikasyon tanımlayıcılarda genişletilmiş karakterlerin kullanılmasına izin vermek istiyorsa, bunu tanımlayıcılarda UCN'lere izin verildiğini belirterek yapar.
14:25
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.