SORU
26 EKİM 2008, Pazar


Yeni yetenekler kullanıcı tanımlı sabitler C Ekle ?

C 11 sunar user-defined literals sağlayacak giriş yeni edebi sözdizimi dayalı mevcut rakamları (int, hex, string, float) böylece her tür mümkün olacak bir edebi sunum.

Örnekler:

// imaginary numbers
std::complex<long double> operator "" _i(long double d) // cooked form
{ 
    return std::complex<long double>(0, d); 
}
auto val = 3.14_i; // val = complex<long double>(0, 3.14)

// binary values
int operator "" _B(const char*); // raw form
int answer = 101010_B; // answer = 42

// std::string
std::string operator "" _s(const char* str, size_t /*length*/) 
{ 
    return std::string(str); 
}

auto hi = "hello"_s   " world"; //   works, "hello"_s is a string not a pointer

// units
assert(1_kg == 2.2_lb); // give or take 0.00462262 pounds

İlk bakışta bu çok güzel görünüyor ama merak ediyorum nasıl uygulanacak gerçekten, ne zaman çalıştım düşünmek zorunda ekleri _AD _BC oluşturma tarihleri buldum sorunlu dolayı operatör sipariş. 1974/01/06_AD ilk değerlendirme 1974/01 (düz ints) ve daha sonra 06_AD (birşey söyleme Ağustos ve Eylül aylarında sahip olmak yazılı olmayan 0 sekizli sebep). Bu sözdizimi operatör değerlendirme amacıyla çalışır 1974-1/6_AD olması çalışılan ama biraz gürültülü.

Ya benim sorum aşağı kaynar bu, bu özelliği kendini haklı çıkaracak bir duygu? Diğer rakamları bunu C kodu daha okunaklı hale getirecek tanımlamak için ne istersin?


Güncelleme Haziran 2011 tarihinde nihai taslağı uygun sözdizimi

CEVAP
26 EKİM 2008, Pazar


İlk bakışta, basit sözdizimsel şeker gibi görünüyor.

Ama daha derin bakıldığında, sözdizimsel şeker daha, olarak görüyoruzC kullanıcı tanımlı türler farklı yerleşik türleri gibi davranır tam olarak oluşturmak için seçenekler sunuyor.Bu, bu küçük bir "bonus" çok ilginç C 11 C ektir .

Gerçekten C olarak ihtiyacı var mı ?

Geçmiş yıllarda yazdığım kodda birkaç kullanır görüyorum, ama C kullanmadım sırf ilginç olmadığı anlamına gelmezbaşka bir C geliştirici.

Kaldık kullanılan C (ve C, sanırım), derleyici tanımlı sabitler, veri tipini sayı olarak kısa ya da uzun tamsayı, gerçek sayı olarak yüzen ya da çift (veya daha uzun bir çift), ve karakter dizeleri olarak normal veya geniş karakter.

C , kendi türleri oluşturmak için olasılığı vardı(yani sınıflar), potansiyel olarak hiçbir yükü (satır içi uygulaması, vb.) ile. Yaptığımız olasılık Ekle operatörler için kendi türlerini, onları uslu gibi benzer yerleşik türleri, hangi sağlar C geliştiriciler için kullanın matris ve karmaşık sayılar doğal olarak onlar bu eklendi için dilin kendisi. Hatta döküm operatörleri genellikle kötü bir fikir (ama bazen, sadece doğru çözüm değil) ekleyebilirsiniz.

Biz hala kullanıcı tipleri dahili tip olarak davranması için bir şey kaçırdım: kullanıcı tanımlı sabitler.

Yani, dil için doğal bir evrim oldu sanırım, ama mümkün olduğunca eksiksiz olması için: "Bir türü oluşturmak için, ve dahili olarak mümkün olduğunca türleri davranmasını istiyorsanız, burada araçları"

Çok benzer olduğunu tahmin ediyorum .NET her bir yapı, Boolean, tamsayı de dahil olmak üzere ilkel kararı, vb., ve tüm yapılar Nesne türetmek. Bu kararı tek başına koyar .Çok NET Java ötesinde ilkel, boks/kutulama kesmek Java özellikleri katacak ne olursa olsun çalışırken ulaşmak.

Gerçekten C olarak ihtiyacı var MI ?

Bu soru içinSANAcevap. Bjarne Stroustrup Değil. Değil Herb Sutter. Standart Komitesi, her neyse. Bu yüzdenC seçim varyerleşik türleri yalnız faydalı bir gösterim kısıtlamak vermiyorlar.

Eğersanabu ihtiyaç, o zaman hoş bir görüntü. Eğersanayok yok... Sakın kullanma. Size hiçbir şey mal olacak.

C , özellikler isteğe bağlı olduğu dil Hoşgeldiniz.

?? Şişirilmiş? Bana komplekslerini göster!!!

Arasında dağlar kadar fark şişirilmiş ve karmaşık (cinas vardır.

What new capabilities do user-defined literals add to C ?, karmaşık bir sayı yazabilme at Niels tarafından gösterilen iki özelliklerden birisi gibi "son" C ve C :

// C89:
MyComplex z1 = { 1, 2 } ;

// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1   2*I;

// C  :
std::complex<double> z1(1, 2) ;

// C  11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1   2_i ;

Şimdi, hem C99 "çifte karmaşık" yazın ve C ":: std" yazın ve çarpma yapabilir, eklenen, düşülen, vb, karmaşık operatör Yükleme kullanarak.

Ama C99, sadece dahili yazın ve yerleşik bir başka türü de ekledi operatör yükleme desteği. Ve yerleşik, değişmez bir özellik eklendi.

C , sadece dil mevcut kullanılan özelliklere, edebi özelliği, dilin doğal bir evrim olduğunu gördü ve ekledi böylece.

C, ihtiyacın olursa aynı gösterimde geliştirme için başka bir tür, sen şansına küs kadar lobi Ekle kuantum dalga fonksiyonları (veya 3B noktaları ya da ne olursa olsun temel bir tipsin kullanarak alan çalışması) C standart olarak yerleşik bir türü başarılı olur.

C 11, kendin yap:

Point p = 25_x   13_y   3_z ; // 3D point

Şişirilmiş mi? Hayırbirlikte , her iki C ve C kompleksleri karmaşık değişmez değerlerini temsil etmek için bir yol gerekir nasıl gösterdiği gibi.

Yanlış tasarlanmış mı? Hayıraklımda kullanildigini her C özelliği olarak tasarlanmış.

Gösterim amaçları için mi sadece? Hayırhatta kodunuzu tipi emniyet ekleyebilirsiniz.

Örneğin, CSS odaklı bir kod düşünelim:

css::Font::Size p0 = 12_pt ;       // Ok
css::Font::Size p1 = 50_percent ;  // Ok
css::Font::Size p2 = 15_px ;       // Ok
css::Font::Size p3 = 10_em ;       // Ok
css::Font::Size p4 = 15 ;         // ERROR : Won't compile !

O zaman çok kolay değer atama için güçlü bir yazmaya zorlamak için.

Tehlikeli midir?

Güzel soru. Bu işlevler namespaced olabilir? Evet, o zaman Jackpot!

Her neyseher şey gibi, Eğer bir aracı uygunsuz şekilde kullanıldığında kendini öldürebilirsin. C güçlü ve C silahı kötüye eğer kafanı vurabilirsin. C C silah, ama aynı zamanda araç içinde bulabilirsiniz ne olursa olsun neşter, taser, ve vardır. Neşteri yanlış kullanımı ve ölüm için kendi kanını emebilirsin. Ya çok zarif ve sağlam bir kod oluşturabilirsiniz.

Her C özelliği gibi, Eğer gerçekten ihtiyacınız var mı? C kullanmadan önce cevap vermen gereken soru bu . Eğer varsa, size hiçbir şey mal olacak. Eğer ihtiyacınız varsa gerçekten, en azından, bu dil sizi yarı yolda bırakmayacak.

Tarih örnek?

Hata, bana öyle geliyor ki, operatörler karıştırma olduğunu

1974/01/06AD
    ^  ^  ^

Bu bir operatör olarak, derleyici yorumlamak gerekir, çünkü Kaçınılması, olamaz. Ve, bildiğim kadarıyla, iyi bir şeydir.

Senin sorunun için bir çözüm bulmak için, başka bir şekilde değişmez yazardım. Örneğin:

"1974-01-06"_AD ;   // ISO-like notation
"06/01/1974"_AD ;   // french-date-like notation
"jan 06 1974"_AD ;  // US-date-like notation
19740106_AD ;       // integer-date-like notation

Şahsen, tamsayı ve ISO tarihleri seçerdim, ama bu SİZİN ihtiyaçlarınıza bağlıdır. Kullanıcı kendi değişmez adları tanımlamanız izin bütün mesele bu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Stanislav Petrov

    Stanislav Pe

    7 ŞUBAT 2009
  • sWooZie

    sWooZie

    9 ŞUBAT 2006