1

При работе с большой базой кода устаревшего кода я сегодня подозревал дублирующее определение, но зависимость не была очевидна для меня, поскольку она зависела от множества компиляций, расчеты времени.Проверяйте некоторые определения времени компиляции во время компиляции со старыми реализациями 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

Вы хотите, чтобы статическое утверждение? –

+0

@NeilKirk Да, похоже, я не знал этого термина, извините. – Wolf

+0

Я бы предложил вам использовать бесплатный компилятор C++ 11 (недавний [Clang] (http://clang.llvm.org/) или недавний [GCC] (http://gcc.gnu.org/). ..) –

ответ

2

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

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

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

#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]; 
+0

Это замечательно, и он работает с моим старым компилятором! – Wolf

1

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

+0

кажется разумным и хорошо выглядит в коде ... – Wolf