STL 是否为其标头指定了标头保护?

Fab*_*ian 4 c++ stl include-guards

我想std::string在我的头文件中提供一些使用的内联便利函数以及使用的库函数const char *,但我不想包含<string>. #ifdef如果<string>是这种情况,我想检查是否包含并提供便利功能。

问题:对于所有 STL 实现,STL 标头中标头保护的名称是否相同?在 Visual Studio 2010 中,头文件保护<string>_STRING_.

YSC*_*YSC 16

这是一个糟糕的想法™。

通常,您不能也不应该依赖编译器/库1的实现细节。最重要的是,正如Fire Lancer在评论中所说,“包含根据顺序具有不同的效果会混淆人们”并添加到您图书馆的 wtf/line 中。

您可以(应该?)做的是记录一个宏,供用户定义以启用您的std::string功能:

#ifdef MY_LIBRARY_ENABLE_STRING_FUNCTIONS
void print(std::string message);
#endif // MY_LIBRARY_ENABLE_STRING_FUNCTIONS
Run Code Online (Sandbox Code Playgroud)

如果用户需要它们,他们必须:

#define MY_LIBRARY_ENABLE_STRING_FUNCTIONS
#include <my_library>
Run Code Online (Sandbox Code Playgroud)

1) C++17 有一个__has_include(<filename>)宏(感谢 acraig5075向我学习这个)它没有帮助,因为它返回一个包含是否可用,而不是如果它已被包含。