我可以安全地使用 #ifdef 来了解是否包含 c++ std header 吗?
Can I safely use #ifdef to know if a c++ std header is included?
首先,我读过这个问题:
我想知道的是:使用 #ifdef
检测是否包含 c++ std header 的安全性如何,如下面的代码所示:
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
}
...这样我不仅可以按照上述问题的答案中的建议将某些标准函数重载为 "worse match",还可以编译或不编译 My [=] 的整个 function/section 35=] 文件,取决于包含的一些标准 header.
像我怀疑的那样,这种方式一点也不安全吗?如果是这样,是否有任何其他方法可以检测到它以执行我想要的操作?
关于"Why the heck don't I just include the header"...
我给出的示例代码只是一个示例。我脑子里还有其他事情,只是想知道是否有另一种方法可以检查是否包含 headers 而无需检查您希望在其中定义的宏。然后我想起了我问自己这个问题的真实情况,然后我开始问我在问什么......因为在这种情况下,我不想包含很多代码(<random>
长于 20 或 30 LOC) 只是为了 "sustain" 我的 header.
的单个功能
有人提议 c++17
添加 __has_include
宏。
最新版本尚未 public,但在上次标准会议上讨论(批准?):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
在那之前,我认为没有可移植的方法来检测 header 是否可用。你能做的最好的事情就是检查 header 定义了什么宏,记住不同的库有不同的宏,即使在同一个库中,名称也可以在不同的修订版本之间改变,因为它是一个内部宏。如果您只想支持主要的编译器(有 3 个)并且不希望您的代码在 3-5 年后得到支持,那还不错。
如果可能的话,您应该检查功能,而不是检查 header。 C++11
之后定义了一组 feature testing macros
:
http://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros
首先,我读过这个问题:
我想知道的是:使用 #ifdef
检测是否包含 c++ std header 的安全性如何,如下面的代码所示:
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
}
...这样我不仅可以按照上述问题的答案中的建议将某些标准函数重载为 "worse match",还可以编译或不编译 My [=] 的整个 function/section 35=] 文件,取决于包含的一些标准 header.
像我怀疑的那样,这种方式一点也不安全吗?如果是这样,是否有任何其他方法可以检测到它以执行我想要的操作?
关于"Why the heck don't I just include the header"...
我给出的示例代码只是一个示例。我脑子里还有其他事情,只是想知道是否有另一种方法可以检查是否包含 headers 而无需检查您希望在其中定义的宏。然后我想起了我问自己这个问题的真实情况,然后我开始问我在问什么......因为在这种情况下,我不想包含很多代码(<random>
长于 20 或 30 LOC) 只是为了 "sustain" 我的 header.
有人提议 c++17
添加 __has_include
宏。
最新版本尚未 public,但在上次标准会议上讨论(批准?):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
在那之前,我认为没有可移植的方法来检测 header 是否可用。你能做的最好的事情就是检查 header 定义了什么宏,记住不同的库有不同的宏,即使在同一个库中,名称也可以在不同的修订版本之间改变,因为它是一个内部宏。如果您只想支持主要的编译器(有 3 个)并且不希望您的代码在 3-5 年后得到支持,那还不错。
如果可能的话,您应该检查功能,而不是检查 header。 C++11
之后定义了一组 feature testing macros
:
http://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros