Ограничения директивы препроцессора C ++ - PullRequest
3 голосов
/ 03 февраля 2011

У меня есть директива препроцессора C ++, которая выглядит примерно так:

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

999999999999999 явно больше, чем 2 32 , поэтому значение не помещается в 32-битное целое числоБудет ли препроцессор правильно использовать 64-битное целое число для разрешения сравнения или усечет одно или оба значения?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Попробуйте использовать суффикс LL:

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

В моем gcc это нормально работает:

#include <iostream>

#define SOME_NUMBER 999999999999999LL

int main()
{

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

    return 0;
}

С или без суффикса LL.

1 голос
/ 03 февраля 2011

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

1 голос
/ 03 февраля 2011

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

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

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

...