2015-10-31 34 views
6

首先,我讀過這個問題:Is there a way to detect portably that a standard header is included using macros?我可以安全地使用#ifdef來知道是否包含C++ std標頭?

而我想知道的是:如何安全是它使用#ifdef的檢測任務,如果包含一個C++的std頭,像在代碼如下:

namespace overwrite 
{ 
    using byte = unsigned char; 

    template <bool safeMode = true, typename generic> 
    void withZeros(generic *toBeOverwriten, size_t length = 1) 
    { 
     // do stuff 
    } 

    #ifdef _GLIBCXX_RANDOM // found this macro inside <random> 
    template <bool safeMode = true, typename generic> 
    void withRandomData(generic *toBeOverwriten, byte min = 0, byte max = 255) 
    { 
     // do stuff expecting <random> to be included 
    } 
    #endif 
} 

...所以,我不能只是重載一些性病的功能「更糟糕的比賽」作爲答案的問題提到的建議,同時也編譯或沒有我的頭的整體功能/節文件,這取決於包含一些標準頭。

這種方式不安全,因爲我懷疑嗎?如果是這樣,是否有其他方法可以檢測到這一點,以便做到我想要的?

關於以「見鬼,爲什麼不讓我包括頭」 ...

我給的是什麼,我試圖做一個例子的代碼僅僅是一個例子。我腦海裏還有其他的東西,只是想知道是否有另一種方法來檢查包含頭文件而不檢查你期望在這些頭文件中定義的宏。然後我想起了這種真實的情況,我問了自己這個問題,並開始問我在問什麼......因爲在這種情況下,我不想包含很多代碼(<random>比20多或30 LOC)只是爲了「維持」我頭部的單個功能。

+1

只需包含頭? – Dani

+0

SFINAE ........? –

+0

順便說一句,你爲什麼不簡單#include隨機? –

回答

3

有一個建議c++17添加__has_include宏。

最新版本還未發佈,但在討論的最後一個標準會議(批准):https://www.reddit.com/r/cpp/comments/3q4agc/c17_progress_update_oct_2015/

以前的版本:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0061r0.html


之前,我不認爲有一種檢測頭是否可用的便攜式方法。您可以做的最好的方法是檢查頭文件定義了哪些宏,並記住不同的庫具有不同的宏,並且即使在相同的庫中,名稱也可以從修訂版本更改爲修訂版本,因爲它是內部宏。如果你只想支持主要的編譯器(有3個),並且不希望你的代碼在3 - 5年後得到支持,那並不壞。

而不是檢查標題,如果可能的話,你應該檢查功能。 C++11向前定義了一組feature testing macros

http://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros

+0

非常有趣的鏈接,特別是這個關於功能測試的鏈接......但'__has_include'看起來離現在還有很遠:( –

相關問題