Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL是否为其标题指定标题保护?_C++_Stl_Include Guards_Sfinae - Fatal编程技术网

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++标准没有完全适用。