【问题标题】:Does the STL specify the header guards for its headers?STL 是否为其标头指定标头保护?
【发布时间】:2020-01-07 09:48:24
【问题描述】:

我想在我的标题中提供一些使用std::string 的内联便利函数以及使用const char * 的库函数,但我不想包含<string>。如果包含<string>,我想检查#ifdef,如果是这样,请提供便利功能。

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

【问题讨论】:

  • 通常包含根据顺序有不同的效果会让人感到困惑。
  • 在 C++17 中你可以使用std::string_view。它比std::string 要轻得多,并提供std::stringconst char* 的只读视图。当然,这仅在您不必改变字符串时才有效。
  • 该标准要求标头在多次包含时能够正常工作。标头保护是最常见的机制,但不是必需的。

标签: c++ stl include-guards


【解决方案1】:

这是一个坏主意™。

通常,您不能也不应该依赖编译器/库的实现细节1。最重要的是,正如 cmets 中的 Fire Lancer 所述,“包含会根据顺序产生不同的影响” 并添加到库的 wtf/line 中。

您可以(应该?)做的是记录一个宏供用户定义以启用您的 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(&lt;filename&gt;) 宏(感谢 acraig5075 向我学习这一点)这无济于事,因为它返回包含是否可用而不是 if它已被包括在内。

【讨论】:

  • 感谢您的宝贵建议。尽管我改变了做我想做的事情的想法,但我仍然很好奇 STL 中的标头保护名称是否标准化。你有这方面的信息吗?
  • @Fabian 不,他们不是。如果他们的开发人员愿意,他们可以使用#pragma once 或任何内置的编译器魔法。他们甚至可能违反单一定义规则,毕竟不要忘记标准库不是用 C++ 正确编写的,而且 C++ 标准也没有完全适用于它。
【解决方案2】:

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

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

【讨论】:

  • 在完全没有声明的情况下,SFINAE 很难;您无法从非依赖查找失败中恢复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2019-03-15
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多