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

你想要一个静态断言? – 2014-09-26 11:31:50

+0

@NeilKirk是的,似乎是这样,我不知道这个词,对不起。 – Wolf 2014-09-26 11:33:31

+0

我建议你使用免费的软件C++ 11编译器(最近的[Clang](http://clang.llvm.org/)或最近的[GCC](http://gcc.gnu.org/))。 ..) – 2014-09-26 12:14:26

回答

2

这工作:

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

实际上我用下面的设置从升压借来的,这样做的目的是给每个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 2014-09-26 13:43:49

1

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

+0

似乎是合理的,看起来不错的代码... – Wolf 2014-09-26 11:43:03