2011-02-03 19 views
3

私はこのようなものであるC++プリプロセッサディレクティブがあります。C++のプリプロセッサディレクティブの制限

#if (SOME_NUMBER != 999999999999999) 
// do stuff 
#endif 

999999999999999は明らかに2 よりも大きくなるので、値は32ビットに収まりません整数。プリプロセッサは64ビット整数を正しく使用して比較を解決するのか、あるいは値の一方または両方を切り捨てますか?

+0

あなたはそれを試して何が起こったのですか? –

+0

確かに動作しているように見えましたが、どちらもINT32_MAXに切り捨てられただけなのかどうかわかりません。 – Colen

+0

SOME_NUMBERがINT32_MAXに等しい別のテストは、それが起こっているかどうかを確認します。 –

答えて

2

はLL接尾辞を使用してみてください:私のgccで

#if (SOME_NUMBER != 999999999999999LL) 
// do stuff 
#endif 

この作品を罰金:

#include <iostream> 

#define SOME_NUMBER 999999999999999LL 

int main() 
{ 

#if (SOME_NUMBER != 999999999999999LL) 
    std::cout << "yes\n"; 
#endif 

    return 0; 
} 

LL接尾辞を伴うまたは伴いません。

+1

接尾辞は不要です: "整数リテラルの型は、その形式、値、接尾辞によって異なりますが、10進数で接尾辞がない場合は、その値を表すことができる最初の型です:..." C++ 03§2.13.1p2)。 –

+0

+1:良い。はい、私はそれに気付きましたが、明示的に型を指定することをお勧めします。 –

1

あなたは "limits.hに" で定義されているUINT_MAX定数を使用して試すことができます:

#if (SOME_NUMBER != UINT_MAX) 
// do stuff 
#endif 

UINT_MAX値は、整数のサイズによって異なります。

1

プリプロセッサ演算は、それらがlongunsigned longあたかもintunsigned intが処理されることを除いて、(16.1/4、標準参照)、通常の定数式として働きます。したがって、64ビットタイプの場合は、通常どおりに使用できます。