Neden herkes standart C türleri yerine yazıyor?


103

Kullanmak isterseniz Qt , sen kucaklamalısın quint8, quint16benzeri ve.

GLib'i kullanmak istiyorsanız, hoş geldiniz guint8, guint16vb.

On Linux vardır u32, s16benzeri ve.

uC / işletim tanımlar SINT32, UINT16ve benzeri biçimde.

Ve bunların bazı kombinasyonlarını kullanmak zorunda kalırsanız, belaya hazırlıklı olsanız iyi olur. Üzerinde Çünkü makineniz u32edilecektir typedefüzerine d longve quint32olacak typedefüzerinde d intve derleyici şikayet .

Varsa neden herkes bunu yapıyor <stdint.h>? Bu, kütüphaneler için bir tür gelenek mi?


8
@Mehrdad mikrodenetleyici programlamasında her türlü şeye sahip olabilirsiniz. Örneğin AVR Mega'da (ve dolayısıyla ünlü Arduino'da) int 16 bittir. Bu kötü bir sürpriz olabilir. Bana göre 'imzasız kısa' daha fazla yazma çabası gerektiriyor. Ve <s> bayt </s> sekizli için 'işaretsiz karakter' kullanmak beni hep üzdü. İmzasız karakter, gerçekten mi?
Amomum

2
@Mehrdad Önemli olan, gerçekten emin olamamanızdır. İşte bu yüzden stdint.hicat edildi.
glglgl

1
@glglgl: Soruna bakmanın başka bir yolu: tam olarak yanlış soruyu sormuyor musunuz? Birden fazla sistemi hedefliyorsanız, neden ilk etapta koda keyfi olarak bit sayısını sabit kodlayasınız? yani, neden sadece sizeof(int) * CHAR_BIT(örneğin) söyleyip kullanmıyorsunuz? Eğer sizin intaralığınızı temsil etmek için çok küçükse (örneğin bir dizi indeksi), o zaman neredeyse kesinlikle kullanmamalısınız int, ama benzeri bir şey size_t. Neden int32daha mantıklı? Tek zaman sabit genişlik, sistemler arasındaki iletişim içindir (örn. Dosya / ağ biçimi) ...
user541686

1
@Mehrdad Hayır. Bazen saklamam gereken değerler (ADC'den veya her neyse) olabilir. 16 bit genişliğinde olduklarını biliyorum. Bu yüzden kullanılacak en iyi şey uint16_t(veya belki onun fastveya leastçeşididir). Demek istediğim şu: Bu türler kullanıma uygundur ve varoluş nedenlerine sahiptir.
glglgl

1
@Mehrdad: - Kaliteli kod üretme çabanıza değeceğini varsayarak - API'mle / kodumun geri kalanıyla etkileşime girme yolu anlamına gelen kendi işlevsel tiplerinizi tanımlamanızı ve bunları teknik gerekçelerle tanımlamanızı öneririm . size_tVe / veya gibi "teknik" tipler uint64_t.
PJTraill

Yanıtlar:


80

stdint.hbu kütüphaneler geliştirilirken mevcut değildi. Böylece her kütüphane kendi kütüphanelerini oluşturdu typedef.


4
Ve tamam, sanırım stdint.h'nin olmaması iyi bir neden, ama neden bugün bile bu türler stdint türler üzerinde değil, uzun ve çok uzun ve çok değil? Bu onları en azından değiştirilebilir hale
getirirdi

25
@Amomum "Glib (Linux üzerinde geliştirilen) neden Linux yazı tiplerini kullanmadı?" Glib'in "ana üssü" kesinlikle Linux olsa da, kesinlikle tasarım gereği taşınabilir bir kitaplıktır. Kendi türlerini tanımlamak taşınabilirliği sağlar: Yalnızca kitaplık türlerini uygun ilgili hedef platform türlerine uygun küçük bir başlık uyarlaması gerekir.
Peter - Monica'yı eski haline

3
@Amomum Neden Glib (Linux'ta geliştirildi) ... Hayır, değildi. Glib oluşturulduğu şekilde Linux çekirdeği önce.
andy256

5
@ andy256 "GLib", "glibc" nin kısaltması değildir. Gtk'den ayrılmış bir kitaplık. Linux'tan daha eski değil.

2
@ andy256: glib 1998, linux 1991. IOW, GLib Linux'tan sonra yaratıldı .
MSalters

40

Daha eski kitaplıklar için, söz konusu başlık ( stdint.h) olmadığı için bu gereklidir .

Bununla birlikte, hala bir sorun var: bu türler ( uint64_tve diğerleri) standartta isteğe bağlı bir özelliktir . Dolayısıyla, uyumlu bir uygulama onlarla birlikte gönderilmeyebilir ve bu nedenle kütüphaneleri bugünlerde hala dahil etmeye zorlayabilir.


14
uintN_tTürleri isteğe bağlıdır, ancak uint_leastN_tve uint_fastN_ttürleri değildir.
Kusalananda

7
@Kusalananda: Ne yazık ki bunlar sınırlı kullanışlı.
Orbit'te Hafiflik Yarışları

16
Onlar isteğe bağlı olduğunu elbette aklın oradaki garanti olmasıdır olan bit tam olarak bu sayı ile türlerine tamsayı. C hala oldukça garip tam sayı boyutlarına sahip mimarileri desteklemektedir.
celtschk

5
@LightnessRacesinOrbit: Nasıl sınırlı kullanışlılar? İtiraf etmeliyim ki, donanım arayüzlerinden ayrı olarak, tüm değerlerinizin uyduğundan emin olmak için neden sadece minimumdan ziyade tam bir bit sayısına ihtiyacınız olduğunu anlamıyorum.
celtschk

23
@Amomum typedefs olan bir uygulama (imzalı türleri için) 8 genişlikleri, 16, 32, veya 64 bit, hiçbir dolgu bitleri ile tipleri tamsayı sağlar ve eğer sahip oldukları, "Ancak: uygulama gereksinimlerini karşılayan türleri varsa gerekli ikinin tümleyen gösterimi, karşılık gelen typedef adlarını tanımlayacaktır. " (N1570'den alıntı, 7.20.1.1 "Tam genişlikli tam sayı türleri") Yani standart kitaplık bunlara sahip değilse, üçüncü taraf bir kitaplık da olamaz, öyle görünüyor.
Eric M Schmidt

13

stdint.h 1999'dan beri standartlaştırılmıştır. Pek çok uygulamanın, temel makine mimarisinden kısmi bağımsızlık sağlamak için türleri tanımlaması (etkili bir şekilde takma ad) olması daha olasıdır.

Geliştiricilere, uygulamalarında kullanılan türlerin, dil standardı veya derleyici uygulamasına uymayan davranışla ilgili projeye özgü varsayımlarıyla eşleştiği konusunda güven sağlarlar.

Uygulama, nesne yönelimli Cephe tasarım modelinde yansıtılır ve tüm içe aktarılan kitaplıklar için değişmez bir şekilde sarmalayıcı sınıfları yazan geliştiriciler tarafından çok kötüye kullanılır.

Karşılaştırıcılar çok daha az standart olduğunda ve makine mimarileri 16-bit, 18-bit ile 36-bit kelime uzunluğu ana bilgisayarları arasında değişebiliyorsa, bu çok daha fazla dikkate alındı. Uygulama, 32-bit ARM gömülü sistemlerde yakınsayan bir dünyada artık çok daha az alakalı. Garip bellek haritalarına sahip düşük kaliteli mikro denetleyiciler için endişe kaynağı olmaya devam ediyor .


1
Kabul edildi, stdint.h1999'dan beri standartlaştırıldı, ancak pratikte ne kadar zamandır mevcut? İnsanlar yeni standartları uygulamak ve benimsemek için ayaklarını çekiyorlar ve bu uzun geçiş döneminde eski yöntemler hala bir zorunluluktur.
Siyuan Ren

1
Tek kötü yakaladım stdint.hbile örneğin platformlarda olmasıdır longve int32_taynı boyut ve temsil hakkına sahip, bir döküm dair hiçbir gereklilik yoktur int32_t*için long*bir erişim güvenilir bir işaretçi verecektir int32_t. Standardın yazarlarının mizanpaj uyumlu türlerin takma adla uyumlu olması gerektiğini açıkça düşündüklerine inanamıyorum, ancak gcc ve IIRC clang yazarları, diğer adlar bile göz ardı edilerek dilin geliştirilebileceğini düşündükleri için bariz olduğu durumlarda.
supercat

2
@supercat - bu muhtemelen C komitesine bir yazım hatası olarak göndermeye değer ... çünkü bu gereksiz bir şekilde aptalca , hafifçe söylemek gerekirse
LThode

@LThode: C komitesinin, bir hata olarak clang ve gcc'nin davranışını abartılı olarak resmen beyan etmesini gerektireceğini kabul etmesi için. Bunun olacağını düşünüyor musun? Umut edilebilecek en iyi şey (ve IMHO'nun mantıksal yoludur), programların "takma modları" belirleme yollarını tanımlamaktır. Bir program çok katı takma ad kurallarını kabul edebileceğini söylüyorsa, o zaman bir derleyici bunu şu anda mümkün olanın ötesinde optimizasyonlara izin vermek için kullanabilir. Bir program, mevcut olanlardan biraz daha programcı dostu kurallar gerektirdiğini belirtirse ...
supercat

... ancak yine de birçok yararlı optimizasyona izin verirse, o zaman bir derleyici mümkün olandan çok daha verimli -fno-strict-alias, ancak yine de gerçekten işe yarayan kod üretebilir . Mevcut bir kod tabanı olmasa bile, tek bir kural kümesi tüm uygulamalar için optimum optimizasyon ve anlambilim dengesini sağlayamaz çünkü farklı uygulamaların farklı ihtiyaçları vardır. Mevcut kod tabanını ekleyin ve farklı modlara duyulan ihtiyaç net olmalıdır.
supercat

3

Yani typedef char to int için gücünüz var.

Bir "kodlama dehşeti", bir şirket başlığının, bir programcının bir boolean değeri istediği bir noktaya sahip olduğundan ve iş için bir karakterin mantıksal yerel tür olduğundan bahsetti ve böyle yazdı typedef bool char. Daha sonra birisi en mantıklı seçim olarak bir tamsayı buldu ve yazdı typedef bool int. Sonuç, Unicode'dan yıllar önce neredeyse oldu typedef char int.

Bence oldukça ileri görüşlü, ileriye dönük uyumluluk.

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.