2010-09-30 20 views
7

Bugün ilk defa projem için 64 bit yapı yaptım. Temel olarak, 64 bit boyut_t türü ve basit int türü arasındaki uyumsuzluktan şikayet eden uyarılar haricinde derlenmiş, bağlanmış ve çalışır durumda.64bit C++ 'da size_t ve int türleriyle ilgili sorunlar nasıl önlenir?

void func(std::vector<Something> &vec) 
{ 
    int n = vec.size(); 
    for (int i=0; i < n; i++) 
    { 
     ....vec[i].... 
    } 
} 

Bu düzeltmek için oldukça kolaydır, ve ben bir yerine döngü endeksleri olarak size_t ya ptrdif_t kullanmak gerektiğini söyleyerek bir makale okudum: Bu çoğunlukla benim kodunda böyle durumlarda oluşur. Ama böyle bir durumda ne yapabilirim?

void outsideLibraryFunc(int n); 

void func(std::vector<Something> &vec) 
{ 
    int n = vec.size(); 
    outsideLibraryFunc(n); 
} 

ben int türünde bir argüman beklediği dışında kütüphanenin işlevi bildirimi, değiştiremez, ve bunu vektör elemanlarının sayısını geçmesi gerekiyor. Derleyici uyarılarını devre dışı bırakmaktan başka ne yapabilirim?

+0

+1'de Q: ben bunu bilmiyordum size_t! = Imzasız int – pm100

+0

@ pm100 It * olabilir * ve 32-bit sistemlerin çoğunda olabilir, ama olması gerekmiyor. Özellikle, LP64 veya LLP64 sözleşmelerini (en modern 64 bit sistemlerini) kullanan 64 bit sistemlerde, "imzasız bir int" den daha büyük olma eğilimindedir. –

+0

ssize_t bazen imzalı bir size_t için kullanılabilir. – user318904

cevap

9

int için açık bir yayın yapın, ör.

void outsideLibraryFunc(int n); 

void func(std::vector<Something> &vec) 
{ 
    outsideLibraryFunc(static_cast<int>(vec.size())); 
} 

O int için size_t dönüştürme ile ilgili olası sorunlardan herhangi ortadan kaldırmaz, ancak bunu bilerek dönüşüm yapıyoruz derleyici anlatmak yapar ve bu konuda sizi uyarmak olmaz.

+0

+1, Daha büyük bir avantaj, kod okunurken, dolaylı olarak örtülü olacak dökümün ve derleyicinin sahip olamayacağı bilgisiyle, mantıklı olup olmadığını doğrulayabilmenizdir. Örnekte olduğu gibi: derleyici, 'size_t 'türünde bir işlev tarafından döndürülen değerin 32bit'lik bir tam sayıya sığmasını sağlamazken, mantıklı olup olmadığını el ile kontrol edebilirsiniz. Taşma kontrolü için –

3

Döküm mü? Ciddi olarak dış kütüphaneyi değiştiremezseniz yapabileceğiniz çok şey yoktur. Ekstra güvenli olmak için taşma kontrolü yapın.

+0

+1 (nadiren 2billion'dan fazla nesneye sahip olmanıza rağmen) –

+0

Taşma durumunu nasıl kontrol ederim? EFLAGS'de bir taşma bitini hatırlıyorum, fakat C-tarzında nasıl erişebilirim? – neuviemeporte

+1

@neuviemeporte: if (vec.size()> INT_MAX) {/ * hata * /} else {/ * (int) yayınlanacak * /}. Ama Viktor'un dediği gibi, kontrol aşırı olabilir ... –