1

在处理大型遗留代码库时,我今天怀疑重复定义,但这种依赖对我人类来说并不明显,因为它依赖于大量编译时计算。

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具有非文字维度的 for 数组:

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

像这样的检查有没有一种非常容易记忆的方法?而且,请不要责怪一个勇敢的老编译器;-)

4

2 回答 2

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];
于 2014-09-26T13:13:54.600 回答
1

如果BOOST_STATIC_ASSERT适用于您的编译器,您应该尝试。

于 2014-09-26T11:36:51.583 回答