2011-09-20 16 views
5

this question kodundaki sonuç ikili koduna karşı bir korunma yolu var mı? İdeal olarak derleme zamanında bir hata ile. Söz Örnek kod:İmzasız bir konteynere negatif bir sayı atamaya çalışırken bir derleme hatasına yol açmanın bir yolu var mı?

unsigned int nVal = 0; 
nVal = -5; // no error! 
+0

'derleyici hatası '? * Atama * çalışma zamanında gerçekleşir. 'Operatörü kullanırken – Nawaz

+1

Orada dolambaçlı dönüştürme kurallarını istismar ederek bir yol olabilir, ama buna artık' imzasız int' kullanmaz böylece kodunuzu değiştirerek anlamına geleceğini, ancak diğer ara sınıfları ile EnforcedUnsignedInt' 'gibi bir şey farklı kod nesil neden = 'imzalı/imzasız. Karar: Pratik/gerçekçi değil. – tenfour

+1

'0 'yerine' 0 '(başlangıç ​​işareti)' nin ilk ataması, muhtemelen istediğiniz uyarı/hatayı da üretecektir. –

cevap

10

sen g ++ kullanıyorsanız, anahtar -Wsign-conversion dönüşümü hakkında uyarır ve -Werror bir hata uyarı olduğunu yapacaktır.

+0

Mükemmel, tam da neyin peşindeydim! –

+0

Visual Studio'da, bir proje oluşturma seçeneklerinde "hataları uyarı olarak işleme" özelliğini de açabilirsiniz. Ve derleyici, int'den unsigned int'ye dönüştürürken olası veri kaybı için bir uyarı vermelidir. – Seb

4

Edit: @ thiton'un yanıtından başka.

Basit atama ile mümkün değil. Ancak, değeri özel sarılmış şekilde'a atadığınızda, bu yardımcı olabilir. yani

nVal = -5; 

,

template<int VAL> 
void Assign (unsigned int &nVal) 
{ 
    typedef int arr[(VAL >= 0) 1 : -1]; 
    nVal = VAL; 
} 

DemoAssign() benzeyen

Assign<-5>(nVal); 

durumlarda, ile değiştirilmelidir. Çalışma zamanında

İlgili konular