C++ STL是否为其标题指定标题保护?
我想在标题中提供一些使用C++ STL是否为其标题指定标题保护?,c++,stl,include-guards,sfinae,C++,Stl,Include Guards,Sfinae,我想在标题中提供一些使用std::string的内联便利函数,以及使用const char*的库函数,但我不想包括。如果包含,我想使用#ifdef进行检查,如果是这种情况,我想提供方便的功能 问题:对于所有STL实现,STL头中的头保护的名称是否相同?在VisualStudio2010中,的标题保护是\u字符串这是个坏主意™. 通常,您不能也不应该依赖编译器/库1的实现细节。最重要的是,正如在评论中所说的,“包含基于顺序的不同效果会让人困惑”,并添加到您的库的wtf/行中 您可以(应该)做的是记
std::string
的内联便利函数,以及使用const char*
的库函数,但我不想包括
。如果包含
,我想使用#ifdef
进行检查,如果是这种情况,我想提供方便的功能
问题:对于所有STL实现,STL头中的头保护的名称是否相同?在VisualStudio2010中,
的标题保护是\u字符串
这是个坏主意™.
通常,您不能也不应该依赖编译器/库1的实现细节。最重要的是,正如在评论中所说的,“包含基于顺序的不同效果会让人困惑”,并添加到您的库的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有一个宏(归功于我对它的了解),它返回一个include是否可用以及它是否已被包含,这对我没有帮助。最可靠的检查方法可能是使用技术
也就是说,不要这样做,当你想区分标题是否被包含,或者包含的顺序时,所有的东西都会发出反模式的尖叫。通常,包含的效果会根据顺序而有所不同,这会让人困惑。在C++17中,你可以使用。它比
std::string
更轻,并且提供了std::string
或const char*
的只读视图。当然,这只有在不必改变字符串的情况下才有效。标准只要求在多次包含标题的情况下标题才能正常工作。标题保护是最常见的机制,但它们不是必需的。感谢您的宝贵建议。尽管我改变了主意,做了我想做的事,但如果STL中的标题保护名称是标准化的,我仍然很紧张。你有这方面的消息吗?@Fabian不,他们没有。如果开发者愿意,他们可以使用#pragma一次
或任何内置编译器魔法。他们甚至可能违反一个定义规则,毕竟不要忘记标准库没有用C++编写,C++标准没有完全适用。