我想在我的标题中使用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技术。
话虽如此,不要这样做,当您想要区分标头是否已包含或包含顺序时,一切都会尖叫反模式。