我正在玩gmock并注意到它包含这一行:
#include <tuple>
我原本期望tuple.h
。
什么时候可以排除扩展名,它是否赋予该指令不同的含义?
答案 0 :(得分:61)
C ++标准头文件后缀没有“.h”。我相信原因是标准会破坏许多不同的预标准实现。因此,标准委员会决定他们放弃后缀(我相信没有),而不是要求供应商将其现有的“iostream.h”(例如)标题更改为符合标准(这将破坏其现有用户的代码)。然后现有的实施已经完成)。
这样,现有的非标准程序将继续使用供应商的非标准库。当用户想要使他们的程序标准兼容时,他们将采取的步骤之一是更改“#include
”指令以删除“.h”后缀。
所以
#include <iostream> // include the standard library version
#include <iostream.h> // include a vendor specific version (which by
// now might well be the same)
正如其他答案所提到的,非标准库的编写者可能会选择命名约定,但我认为他们希望继续使用“.h”或“.hpp”(如Boost所做的那样)原因:
请注意,当委员会向STL添加哈希映射时发生了类似的问题 - 他们发现已经存在许多(不同的)hash_map
实现,因此不会提出标准的实现今天打破了很多东西,他们正在调用标准实现“unordered_map
”。命名空间应该有助于防止这种类型的跳跃,但它似乎不能很好地工作(或使用得很好),以允许他们使用更自然的名称,而不会破坏大量的代码。
请注意,对于“C”标题,C ++允许您包含<cxxxxxx>
或<xxxxxx.h>
变体。以'c'开头且没有“.h”后缀的那个将其声明放在std
命名空间(可能还有全局命名空间)中,带有“.h”后缀的那些将名称放在全局命名空间(一些编译器也将名称放在std
命名空间中 - 我不清楚这是否符合标准,但我没有看到它的危害。)
答案 1 :(得分:18)
如果文件名为tuple
,则需要#include <tuple>
如果它的名称为tuple.h
,那么您需要#include <tuple.h>
就这么简单。您没有省略任何扩展名。
答案 2 :(得分:15)
它包含一个简单命名为“tuple”的文件 - 文件本身缺少扩展名。
C ++包含文件的推定标准是在没有.h扩展名的情况下命名它们;许多图书馆作者遵循这个标准(STL等),但有些不遵守。
答案 3 :(得分:6)
没有什么特别的事。该文件名为tuple
。
标准库标头没有文件扩展的原因是namespace
s。
使用C ++ 98标准将命名空间添加到游戏后期的C ++标准中,包括所有标准库实体所在的std
命名空间。
当标准库移动到std
命名空间时,这意味着所有现有的C ++代码都会破坏,因为它们都希望库位于全局命名空间中。解决方案是单独保留旧的“dot-h”头文件,并在没有扩展名的文件中提供命名空间库。
这样,#include<iosteam.h>
可以预期全局cout
的旧代码可能会#include<iostream>
std::cout
并期望{{1}}。
答案 4 :(得分:4)
我的理解是#include元组会“指向”tuple.h。
答案 5 :(得分:4)
除了已经发布的优秀答案之外,应该注意的是C ++标准不需要指令“#include <iostream>
”来读取名为“iostream”的文件,甚至“iostream.h”。 。它可以被命名为“fuzzball”。或者,不存在相应的文件,并且定义将内置到编译器中并由include伪指令激活。
答案 6 :(得分:-4)
伙计,
我认为这笔交易是:#include&lt; lib&gt;总的来说预 pends / lib / include到搜索路径(.h是infrerred)而#include&lt; lib.h&gt;只搜索-I&lt; pathname&gt;。
请注意我可能错了......这就是我认为它的工作原理(在Solaris上的Forte cc中)。