在处理大型遗留代码库时,我今天怀疑是一个重复的定义,但依赖对我来说并不明显,因为它依赖于大量的编译时计算。
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
这样的支票是否有一种非常容易记忆的方式? 并且,请不要责怪一个老勇敢的编译器; - )
答案 0 :(得分: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];
答案 1 :(得分:1)
如果BOOST_STATIC_ASSERT
适用于您的编译器,则应该尝试。