c++ 什么时候可以在#include指令中省略文件扩展名?

ccrfmcuu  于 10个月前  发布在  其他
关注(0)|答案(7)|浏览(88)

我正在使用gmock,注意到它包含这行代码:

#include <tuple>

字符串
我以为是tuple.h
什么时候可以排除扩展名,它是否赋予给予不同的含义?

yb3bgrhw

yb3bgrhw1#

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所做的那样),原因有几个:
1.如果库被标准化,标准版本不会自动覆盖以前的非标准版本(很可能导致用户代码损坏)。
1.这似乎是一个约定(或多或少),没有后缀的头文件是标准库,而那些有后缀的(除了C兼容性头文件)是非标准的。
请注意,当委员会向STL添加散列Map时,也发生了类似的问题--他们发现已经有很多散列Map了,(不同的)hash_map实现,所以他们没有提出一个标准的,打破了很多东西在那里今天,他们称之为标准实现“unordered_map“。空间应该有助于防止这种类型的跳跃通过箍,但它似乎工作得不够好(或者使用得不够好),无法让他们在不破坏大量代码的情况下使用更自然的名称。
请注意,对于'C'头文件,C++允许您包含<cxxxxxx><xxxxxx.h>变体。以'c'开头且没有“.h”后缀的变体将其声明放在std命名空间中(也可能在全局命名空间中);带有“.h”后缀的文件将名称放在全局名称空间中(也可能放在std名称空间中)。

qvk1mo1f

qvk1mo1f2#

如果文件名为tuple,则需要#include <tuple>如果文件名为tuple.h,则需要#include <tuple.h>
就这么简单。你不能省略任何扩展。

xv8emn3q

xv8emn3q3#

它包含一个简单命名为“tuple”的文件--该文件本身没有扩展名。
C++包含文件的假定标准是不带.h扩展名命名它们;许多库编写者遵循这个标准(STL等),但有些不遵循。

qaxu7uf2

qaxu7uf24#

没有什么特别的事情发生。文件只是简单地命名为tuple
标准库头没有文件扩展名的原因是因为namespace s。
命名空间是在C98标准的后期添加到C标准中的,包括所有标准库实体所在的std命名空间。
当标准库被移动到std命名空间时,这意味着所有现有的C++代码都将中断,因为所有代码都希望库位于全局命名空间中。解决方案是保留旧的“dot-h”头文件,并在没有扩展名的文件中提供命名空间库。
这样,旧代码#include <iosteam.h>可以期望全局cout,而新代码可以#include <iostream>并期望std::cout

wnavrhmk

wnavrhmk5#

除了已经发布的好答案之外,应该注意的是,C++标准不需要指令“#include <iostream>“来读取名为“iostream”或甚至“iostream. h”的文件。它可以被命名为“fuzzball”。或者,没有相应的文件可能存在,并且定义被内置到编译器中并由include指令激活。

h9vpoimq

h9vpoimq6#

我的理解是#include tuple将“指向”tuple. h。
看看这个:iostream vs iostream.h

xfyts7mz

xfyts7mz7#

各位,
我认为这是:#include allwaysprepends /lib/include到搜索路径(.h是infrred),而#include<lib.h>搜索只是-I。
请注意,我可能是错的……这只是我认为它是如何工作的(在Solaris上的Forte cc中)。

相关问题