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

Does the STL specify the header guards for its headers?

本文关键字:保护 是否 STL      更新时间:2023-10-16

我想在我的标题中使用std::string以及使用const char *的库函数提供一些内联便利函数,但我不想包含<string>。我想与#ifdef核实是否包含<string>,如果是这种情况,则提供便利功能。

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

这是一个坏主意™。

通常,您不能也不应该依赖编译器/库1的实现细节。最重要的是,正如Fire Lancer在评论中所说,"包含基于顺序有不同的效果会让人们感到困惑">,并添加到库的wtf/行中。

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

#ifdef MY_LIBRARY_ENABLE_STRING_FUNCTIONS
void print(std::string message);
#endif // MY_LIBRARY_ENABLE_STRING_FUNCTIONS

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

#define MY_LIBRARY_ENABLE_STRING_FUNCTIONS
#include <my_library>

1(C++17 具有__has_include(<filename>)宏(感谢 acraig5075 向我学习这一点(,这无济于事,因为它返回包含是否可用,如果已包含,则不返回。

最可靠的检查方法可能是使用sfinae技术。

话虽如此,不要这样做,当您想要区分标头是否已包含或包含顺序时,一切都会尖叫反模式。