我正在玩 gmock 并注意到它包含这一行:
#include <tuple>
我本来期望tuple.h
.
什么时候可以排除扩展名,它是否会给指令带来不同的含义?
C++ 标准头文件没有“.h”后缀。我认为原因是该标准会破坏许多不同的预标准实现。因此,标准委员会没有要求供应商将其现有的“iostream.h”(例如)标头更改为符合标准(这会破坏其现有用户的代码),而是决定放弃后缀(我认为这不会那么现有的实施已经完成)。
这样,现有的非标准程序将继续使用供应商的非标准库工作。当用户想要使他们的程序符合标准时,他们将采取的步骤之一就是更改“#include
”指令删除“.h”后缀。
So
#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 所做的那样),原因如下:
- 如果库实现标准化,标准版本不会自动覆盖以前的非标准版本(很可能导致用户代码损坏)。
- 不带后缀的头文件是标准库,而带后缀的头文件(C 兼容性头文件除外)是非标准,这似乎是一种约定(或多或少)。
请注意,当委员会去向 STL 添加哈希映射时,发生了类似的问题 - 他们发现已经有很多(不同的)hash_map
现有的实现,因此他们没有提出一个破坏当今许多东西的标准实现,而是将其称为“标准实现”unordered_map
命名空间本应有助于防止这种类型的跳跃,但它似乎工作得不够好(或使用得不够好),无法让他们在不破坏大量代码的情况下使用更自然的名称。
请注意,对于“C”标头,C++ 允许您包含<cxxxxxx>
or <xxxxxx.h>
变体。以“c”开头并且没有“.h”后缀的那些将其声明放在std
命名空间(也可能在全局命名空间中);带有“.h”后缀的将名称放在全局命名空间中(也可能放在std
命名空间)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)