2015-07-19 65 views
6

我試圖測試libstdc++的版本,因爲版本中的std::regex is implemented, but largely broken,在版本4.9.0之前隨GCC發佈。如何在編譯時測試libstdC++的版本,而不是GCC?

需要注意的是:

是否有測試libstdc++不依賴於使用GCC編譯我的版本的任何可移植的方法?

+0

如果你知道它在某個版本的破碎,然後對其進行測試,看看它壞了,如果是,那麼你有破碎的版本,如果沒有,那麼你有工作版本。 – ydobonebi

+1

在實踐中,確定沒有給出版本的版本的最佳方法是測試已知行爲。只是想澄清一點。除此之外,你在使用什麼操作系統?我正在檢查窗口,如果我可以確定我的ersion數字或不... – ydobonebi

+1

Quinn Roundy:我寧願實際測試版本。該錯誤只發生在運行時,所以我將不得不編譯(並執行)測試程序作爲我的構建過程的一部分。在交叉編譯時,這可能會中斷。 –

回答

-2

在我看來,這個問題足夠小,可以通過暴力解決。

在一個名爲machine.hpp或類似的頭文件中,我會測試C++標準的版本至少是我需要的(__cplusplus宏)。然後,我會添加各種宏檢查來拒絕任何我知道存在缺陷的庫。

換句話說,我會拿黑名單的辦法,而不是白名單的做法。

例如:

#pragma once 
#ifndef MACHINE_HPP_HEADER_GUARDS 
#define MACHINE_HPP_HEADER_GUARDS 

#if __cplusplus < 201103L 
// Library is incompatible if it does not implement at least the C++11 
// standard. 
#error "I need a library that supports at least C++11." 
#else 
// Load an arbitrary header to ensure that the pre-processor macro is 
// defined. Otherwise you will need to load this header AFTER you 
// #include the header you care about. 
#include <iosfwd> 
#endif 

#if __GLIBCXX__ == 20150422 
#error "This version of GLIBCXX (20150422) has flaws in it" 
#endif 

// ...repeat for other versions of GLIBCXX that you know to be flawed 

#endif // MACHINE_HPP_HEADER_GUARDS 
+0

我想知道如何「添加各種宏檢查以拒絕任何庫我知道這是有缺陷的。「在使用非GCC編譯器(例如Clang)構建時,我無法弄清楚如何可靠地檢查'libstdC++'的版本。 –

+0

感謝您擴大您的答案。但是,這不是一個可維護的解決方案。 '__GLIBCXX__'不會單調遞增,因此每次發佈GCC> 4.9的新版本時都必須編輯此頭文件。 –

+0

@MichaelKoval不是這種情況。正因如此,您只需標記您不想使用的編譯器。當新版本的GCC出來時,您只需使用它,而不需要對標題進行任何修改。 – Escualo

相關問題