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