<分区>
考虑这个翻译单元:
#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
:) 谢谢。