2011-09-20 5 views
5

this questionのコードからバイナリを保護する方法はありますか?理想的には、コンパイル時にエラーが発生します。質問からコード例は:符号なしコンテナに負の数を代入しようとするとコンパイルエラーが発生することはありますか?

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

実行時に 'compiler error'? *割り当て*は実行時に発生します。 – Nawaz

+1

複雑な変換規則を利用する方法があるかもしれませんが、 'unsigned int'をもう使用しないようにコードを変更することを意味しますが、' EnforcedUnsignedInt'のような他の中間クラスを使用すると、 = '符号付き/符号なし。評決:現実的ではない。 – tenfour

+1

'0u'ではなく' 0'(署名されている)の初期割り当ては、おそらく警告/エラーを生成します。 –

答えて

10

あなたがG ++を使用している場合は、スイッチ-Wsign-conversionは変換について警告し、-Werrorはエラーを警告することを行います。

+0

完璧な、ちょうど私が後だった! –

+0

Visual Studioでは、プロジェクトのビルドオプションで「警告をエラーとして扱う」機能を有効にすることもできます。また、コンパイラは、intからunsigned intに変換する際に、データが失われる可能性があるという警告を表示する必要があります。 – Seb

4

:@ thitonの回答とは別に、

単純な割り当てでは不可能です。ただし、値が小さい場合はを特別なラップ方法に割り当てると役立ちます。すなわち

nVal = -5; 

をに置き換える必要があり、

Assign<-5>(nVal); 

Assign()

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

Demo、のように見える場合は、。