C++风格问题: what to #include?

标签 c++ coding-style include

<分区>

考虑这个翻译单元:

#include <map>
#include <string>
int main()
{
   std::map<std::string, std::size_t> mp;
   mp.insert(std::make_pair("hello", 42)); 
}

这个翻译单元中有两件事困扰着我,它们是

  • std::size_t
  • std::make_pair

我刚刚假设 <cstddef><utility>一定是 #include d by <string><map> .
这个假设有多正确?至少 make_pair我认为这是一个非常有力的保证,因为 map 成员接口(interface)使用 std::pair .对于 std::size_t没有正式的保证,但仍然非常非常有可能在您包含 map 后立即可用。或 string .第一个文体问题是你会明确地包括<cstddef>吗?和 <utility>在这个翻译单元?

这部分部分处理了一些标题已经包含的不确定性。但是,还有问题的第二部分。假设我们有这个

//f.h
#ifndef BIG_F_GUARD
#define BIG_F_GUARD
#include <string>
std::string f();
#endif   

//f.cpp
#include "f.h"
std::string f()
{
    std::string s;
    return s;
}

第二个问题是:你会明确#include <string>吗?进入 f.cpp?

我想我的问题已经说清楚了。顺便提一句。两个问题后面都有一个很大的 WHY :) 谢谢。

最佳答案

在第一种情况下,如果我希望我的代码能够正确移植,我可能不会,但我应该这样做。没有要求 map::size_typesize_t , 所以没有必要 <map>包括 size_t 的定义.就此而言,size_t可以是类型别名而不是不同的类型,所以即使 size_type size_t , 它不需要在 <map> 中定义使用那个名字。所以正如你所说,很可能但不能保证 <map>包括 <cstddef> .

在第二种情况下,我绝对不会,因为我知道我不需要。 IMO .cpp 文件有权依赖其相应的 .h 文件包含的 header ,因为您有点期望如果您修改 .h 文件,您可能也需要修改 .cpp 文件——更改接口(interface)意味着更改它的实现,大部分时间。即使您觉得我没有资格,我也可以随时记录 f.h 包含 <string> ,在这种情况下我可以信赖它。

关于 <utility> ,我不知道是否<map>允许定义 std::pair (因为它需要它)而不定义 std::make_pair (来自相同的标准 header ,为了论证,我们假设不需要定义 <map> )。如果实现版本为 <utility>,这将是可能的本身包括一堆其他文件,用于不同的位,和<map>只包含它需要的部分。 headers 被赋予了包含其他headers 的特定权限,但我不知道headers 是否被赋予了将东西放入命名空间std 中的特定权限。不包括整个相应的标题。问题是,实际上很难注意到在这些情况下您忘记了标准包含,因为实现不会为您检查,这就是为什么我知道在实践中我很可能不会这样做。幸运的是,对于任何移植到具有不同 header 依赖项的实现的人来说,这应该是任何简单的修复。

关于C++风格问题: what to #include?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4276493/

相关文章:

javascript - 使用指针将 C++ 转换为 JavaScript( Node )*

c++ - 如何在 Visual Studio 2017 中使用 VC++ 包含目录的子文件夹

ios - 如何在混合代码 Objective-C/C++ 文件(.mm 文件)中使用 PHPhotoLibrary?

私有(private)嵌套类中的 Java 作用域修饰符

ruby-on-rails - Rails Active Record 通过多个连接进行排序

c++ - 将模板参数与 null 进行比较

c++ - 复制构造函数奇怪的编译错误

c++ - 查找 Internet Explorer_Server 的链接元素并发送 Click() 事件 (C++)

c - glib 是否可以以不显眼的方式使用?

javascript - JavaScript 是否有任何编码标准?