2011-02-03 4 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 суффикс:

#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

Суффикс не нужен: «Тип целочисленного литерала зависит от его формы, значения и суффикса. Если он десятичный и не имеет суффикса, он имеет первый из этих типов, в котором его значение может быть представлено: ...» (C++ 03 §2.13.1p2). –

+0

+1: Хорошо. Да, я заметил это, но я считаю хорошей практикой четко указать тип. –

1

Вы можете попробовать использовать константу UINT_MAX, определенный в "limits.h":

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

UINT_MAX значение меняется в зависимости от размера целого числа.

1

Препроцессор арифметика работает как нормальные постоянные выражения (см стандарт, 16,1/4), за исключением того, что int и unsigned int рассматриваются как если бы они были long и unsigned long. Поэтому, если у вас 64-разрядный тип, вы можете использовать его как обычно.

Смежные вопросы