Проверьте некоторые определения времени компиляции во время компиляции с более старыми реализациями C ++

При работе с большой базой унаследованного кода я сегодня подозревал дублирующееся определение, но эта зависимость не была очевидна для меня, человека, поскольку она зависела от множества вычислений во время компиляции.

enum { MAX_ITEMS = 4 }; // defined somewhere in my code universe
enum { ITEMS_MAX = COMPLICATED_CALCULATIONS }; // somewhere else

Я вспомнил некоторые случаи с аналогичными sizeof вопросы, когда Я позволю компилятору говорить.

Я обычно помещаю некоторые специальные формулировки, подобные этой, в код (в IDE), затем нажимаю [Alt] + [F9]:

void check() {
char bla[MAX_ITEMS == ITEMS_MAX]; // compiler-error shows difference
// ...but it causes a compiler warning about bla being never used
}

…и это только потому, что мой компилятор (Borland C ++ 5.6.4) ленивый оценивает typedef для массивов с не буквальным измерением:

typedef char bla[0];       // immediate compiler error
typedef char bla[0 != 0];  // obvious, but no compiler error HERE

Есть ли действительно простой способ запомнить такие проверки? И, пожалуйста, не вините старого храброго компилятора 😉

1

Решение

Это работает:

#define STATIC_ASSERT(x) typedef char foo[(x) ? 1 : -1];

Я на самом деле использую следующую настройку, заимствованную из Boost, целью которой является дать каждому файлу свой номер строки (в противном случае может произойти ошибка множественного определения):

#define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y )
#define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y)
#define BOOST_DO_JOIN2( X, Y ) X##Y
#define STATIC_ASSERT(x) \
typedef char BOOST_JOIN(violation_on_line_,__LINE__) [(x) ? 1 : -1];
2

Другие решения

Вы должны попробовать, если BOOST_STATIC_ASSERT работает на вашем компиляторе.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector