2017-08-25 153 views
6

Platformdan bağımsız olması beklenen büyük bir proje üzerinde çalışmaya başladım, ancak aslında uygulamada char gibi tanımlanmış türleri kullanıyor. Bazı aygıtlar için varsayılan olarak signed, unsigned için ise, bazı sorunlar nedeniyle, bu zaten bazı sorunlara neden olmuştu.Platform bağımsız kodunda uygulama tanımlı türlerden kaçının

Platform tanımlı olması gereken kodda uygulama tanımlı türlerin kullanılmasını önlemek için bir çözüm bulmak istiyorum.

  1. En iyi çözüm ne olurdu? Tüm değişkenleri unsigned char (veya signed char) olarak derleyici parametrelerini (ex: -funsigned-char), typedef s veya diğerlerini kullanarak yeniden tanımlamak?
  2. Standart, imzalanmış veya imzasız olup olmadığını tanımlayamayan başka türleri var mı?
+1

https://tr.wikibooks.org/wiki/C_Programming/inttypes.h –

+0

'char' imzası platform değil, ancak derleyici tanımlıdır. Yani '1'de listelenen herhangi biri yapacağız. Ama açık tip beyanıyla giderdim. 2) Hayır (standart yerleşik tipler için). –

+2

@EugeneSh. "Platform" genellikle derleyiciyi de içerir :) –

cevap

5

, cevap çok basit:

daima onlar içindir amaçla türlerini kullanabilirsiniz. Örneğin. bir dizinin boyutu gibi bir şey için uygulama tanımlı türleri istiyorum, çünkü farklı platformlarda, böyle bir boyut üst sınırı farklı olacaktır. Işaretçiler için benzer. Sabit boyutlu tiplerin ihtiyacı için, C zaten stdint.h'da uygun typedef s sağlar. Sabit bir büyüklüğe sahip gerekmez ve 16 bit aralığını hiçbir zaman aşmaz tam sayılar için

  • kullanımı (unsigned) int:

    İşte tamamlanmamış "what kullanımlı" listesi

  • int karakterleri depolayan kitaplık işlevleriyle uğraşırken int karakterleri için char karakterlerini ve kodlarını kullanın.
  • Nesnelerin boyutuyla ilgili herhangi bir şey için size_t kullanın. dizi indisleri
  • bir tamsayı ibrenin değeri saklamak için gereken zaman
  • kullanımlar uintptr_t
  • kullanımı intX_t/uintX_t (X ile bit sayısı olarak) Eğer bit sabit sayıda gereken herhangi bir tamsayı için Hedef platforma bağlı olarak değişmemelidir.
  • Türün boyutunun gerçekten büyük olup olmadığı önemli değilse, bunun yerine int_leastX_t/uint_leastX_t kullanın. Bir okula hitap edemeyen bir uygulama, örn. uint8_t, ancak uint_least8_t daha fazla bit sağlar.
+0

* ama (muhtemelen) uint_least8_t' daha fazla biti ile * sağlardı. Fakat 'uint_least8_t' C standardı tarafından gerekli. Platform standart uyumlu değilse, platforma özgü "typedef" kullanmadan gerçek taşınabilirlik oldukça olasıdır. –

+0

@AndrewHenle iyi, bunu daha kesin bir şeye değiştireceğim ... unutun, sadece "muhtemelen" yi kaldıracağım - doğru, en az C99'a uymayan uygulamaları tartışmak çok mantıklı değil İşte –

1

Bunu yapmanın klasik yolu, kendi yazımlı tiplerinizi kullanmak ve make/autoconf'unuzu platform özelliklerini algılamak ve sizin için typdefs'i kurmaktır. Teoride

+0

Bunu yapmak için eski moda bir yoldur. Ama kendi yazdığınız şeyleri korumak büyük, gereksiz bir sıkıntı. ' 'yerine standart türleri kullanın:' int8_t', 'uint16_t' vb –

+0

Bunu söyleyecektim, fakat bu hangi derleyicilere sahip olduğunuza ve bu standartları destekleyip desteklemediğine bağlıdır (tüm modern olanları biliyorum). meli). Ayrıca, ihtiyaç duyulmayan türler olabilir – pm100

0

bu düşünce iki okul vardır: ne kadar büyük oldukları bilemez çünkü

  1. , int ve char gibi "düz" türü kullanmayın. Her zaman <stdint.h>'da tanımlananlar gibi sabit boyutlu tipler kullanın.
  2. int ve char gibi "düz" türlerini, her zaman makinenizdeki yerel türlerle eşleşmeleri gerektiğinden kullanabilirsiniz. Neyin garanti edildiğini ve garanti edilmediğini öğrenin, böylece uygun olanı seçebilirsiniz, yani bazen long int veya unsigned int veya unsigned int veya size_t veya başka bir şey istersiniz. Tam boyutta bir türe ihtiyacınız olduğunda (umarım nadiren) durumlarda, <stdint.h>'da tanımlananları kullanın.

Bu, sonsuza dek tartışılan, hiç kimsenin üzerinde anlaşmaya varmadığı bir asıl soru.