私はこのようなものであるC++プリプロセッサディレクティブがあります。C++のプリプロセッサディレクティブの制限
#if (SOME_NUMBER != 999999999999999)
// do stuff
#endif
999999999999999は明らかに2 よりも大きくなるので、値は32ビットに収まりません整数。プリプロセッサは64ビット整数を正しく使用して比較を解決するのか、あるいは値の一方または両方を切り捨てますか?
私はこのようなものであるC++プリプロセッサディレクティブがあります。C++のプリプロセッサディレクティブの制限
#if (SOME_NUMBER != 999999999999999)
// do stuff
#endif
999999999999999は明らかに2 よりも大きくなるので、値は32ビットに収まりません整数。プリプロセッサは64ビット整数を正しく使用して比較を解決するのか、あるいは値の一方または両方を切り捨てますか?
は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接尾辞を伴うまたは伴いません。
接尾辞は不要です: "整数リテラルの型は、その形式、値、接尾辞によって異なりますが、10進数で接尾辞がない場合は、その値を表すことができる最初の型です:..." C++ 03§2.13.1p2)。 –
+1:良い。はい、私はそれに気付きましたが、明示的に型を指定することをお勧めします。 –
あなたは "limits.hに" で定義されているUINT_MAX
定数を使用して試すことができます:
#if (SOME_NUMBER != UINT_MAX)
// do stuff
#endif
UINT_MAX
値は、整数のサイズによって異なります。
プリプロセッサ演算は、それらがlong
とunsigned long
あたかもint
とunsigned int
が処理されることを除いて、(16.1/4、標準参照)、通常の定数式として働きます。したがって、64ビットタイプの場合は、通常どおりに使用できます。
あなたはそれを試して何が起こったのですか? –
確かに動作しているように見えましたが、どちらもINT32_MAXに切り捨てられただけなのかどうかわかりません。 – Colen
SOME_NUMBERがINT32_MAXに等しい別のテストは、それが起こっているかどうかを確認します。 –