C++ 使用较旧的C+;在编译时检查一些编译时定义+;实现

C++ 使用较旧的C+;在编译时检查一些编译时定义+;实现,c++,compile-time,static-assert,compile-time-constant,c++builder-6,C++,Compile Time,Static Assert,Compile Time Constant,C++builder 6,在处理大型遗留代码库时,我今天怀疑存在重复的定义,但这种依赖性对我来说并不明显,因为它依赖于大量编译时计算 enum { MAX_ITEMS = 4 }; // defined somewhere in my code universe enum { ITEMS_MAX = COMPLICATED_CALCULATIONS }; // somewhere else 我记得有一些类似的sizeof问题,当我让编译器说话时 我通常会在代码中(在IDE中)放入一些特殊的公式,然后按[Alt]+[F9

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

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)懒惰地评估了具有非文字维度数组:<代码> TyPorfF:

typedef char bla[0];       // immediate compiler error
typedef char bla[0 != 0];  // obvious, but no compiler error HERE
像这样的支票真的有容易记忆的方法吗?还有,请不要责怪一个勇敢的老编译器;-)

您应该尝试在您的编译器上运行if。

这可以:

#define STATIC_ASSERT(x) typedef char foo[(x) ? 1 : -1];
我实际上使用了从Boost借用的以下设置,其目的是为每个foo提供自己的行号(否则可能会发生多定义错误):


你想要一个静态断言吗?@NeilKirk是的,似乎是这样,我不知道这个术语,对不起。我建议你使用一个免费软件C++11编译器(最近的或最近的…@BasileStrynkevitch谢谢提示:),但代码库存在编译器锁定问题:(
#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];