2015-10-31 35 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'看起来离现在还有很远:( –

相关问题