2

我使用Boost 1.46龜的lib 1.2.4和編譯器從Visual Studio Express的2013年我有下面的類嘲笑:爲什麼要在Boost Turtle中爲運算符float()使用MOCK_NON_CONST_METHOD_EXT?

struct IPredicate 
{ 
    virtual ~IPredicate() {} 

    virtual bool operator()(float value) = 0; 
}; 

當我嘲笑運營商()與MOCK_NON_CONST_METHOD:

MOCK_BASE_CLASS(MockPredicate, IPredicate) 
{ 
    MOCK_NON_CONST_METHOD(operator(), 1, bool(float), id) 
}; 

我有一堆編譯器錯誤,例如語法錯誤「操作符」等。但是,當我與MOCK_NON_CONST_METHOD_EXT嘲笑它:

MOCK_BASE_CLASS(MockPredicate, IPredicate) 
{ 
    MOCK_NON_CONST_METHOD_EXT(operator(), 1, bool(float), id) 
}; 

一切正常和完美的作品!根據http://turtle.sourceforge.net/turtle/reference.html帶有EXT後綴的MOCKS適用於「不支持可變宏的編譯器」,但我使用的是支持(使用這些示例檢查它:http://msdn.microsoft.com/en-us/library/ms177415.aspx)。其餘的文件不太清楚這種情況。

有人能解釋我這裏的情況嗎?爲什麼當我不使用EXT後綴MOCK版本時出現錯誤?

回答

2

堅持者的回答是,通常不會有可變參數宏的保證,因爲可變參數宏在C++ 03中是非標準的(但在C++ 11中是標準的)。所以,如果你有一個避免可變宏的方法,你應該使用它來代替具有可變宏的那個方法。

實際上,雖然很可能烏龜庫沒有經過msc的廣泛測試,並且僅僅依賴於宏的非標準gcc擴展之一。這些擴展在「變量宏」http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html頁面上進行了討論。具體而言,爲了使所有C99一致性編譯器能夠移植龜圖書館,只能使用__VA_ARGS__

使用宏時,當您在根情況之後時 - 使用msc的/ P開關(Preprocess to a File)生成.i文件,其中擴展了預處理器指令,您可以在其中查看不滿意的內容。

更新。當我完成這個漫長的故事時,我決定快速下載烏龜,並檢查宏定義的方式。正如我所做的那樣,我發現這只是一個無法維護的文檔而已。在庫上運行grep包括我根本找不到MOCK_NON_CONST_METHOD。這就是爲什麼你得到語法錯誤。避免宏的另一個原因 - C++錯誤消息的清晰度和清晰度。

1

(我是龜的作者)

與什麼發生了1.2.4是一個原因,我並沒有真正調查所提供的代碼實際上1.2.1與1.2.4文件一起。 由於沒有人通過直接在sourceforge上打開票據而抱怨,直到相當一段時間過去了(我所有使用烏龜的個人和公司項目都不斷與最新的源代碼集成)才注意到。

無論如何,我只是測試了你的代碼,它用MSVC 2013,turtle 1.2.6和boost 1.55編譯。如果你還沒有這樣做,你應該考慮升級。

相關問題