我正在使用gmock,注意到它包含这行代码:
#include <tuple>
字符串我以为是tuple.h。什么时候可以排除扩展名,它是否赋予给予不同的含义?
tuple.h
yb3bgrhw1#
C++标准头文件没有“.h”后缀。我相信原因是有许多不同的标准前实现,标准会破坏。因此,与其要求供应商更改现有的“iostream. h”(例如)标头符合标准(这将破坏他们现有的用户代码),标准委员会决定他们将删除后缀(我相信当时没有现有的实现已经这样做了)。这样,现有的非标准程序将继续使用供应商的非标准库。当用户希望使他们的程序符合标准时,他们将采取的步骤之一是更改“#include“指令以删除“.h”后缀。所以
#include
#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名称空间中)。
hash_map
unordered_map
<cxxxxxx>
<xxxxxx.h>
std
qvk1mo1f2#
如果文件名为tuple,则需要#include <tuple>如果文件名为tuple.h,则需要#include <tuple.h>就这么简单。你不能省略任何扩展。
tuple
#include <tuple.h>
xv8emn3q3#
它包含一个简单命名为“tuple”的文件--该文件本身没有扩展名。C++包含文件的假定标准是不带.h扩展名命名它们;许多库编写者遵循这个标准(STL等),但有些不遵循。
qaxu7uf24#
没有什么特别的事情发生。文件只是简单地命名为tuple。标准库头没有文件扩展名的原因是因为namespace s。命名空间是在C98标准的后期添加到C标准中的,包括所有标准库实体所在的std命名空间。当标准库被移动到std命名空间时,这意味着所有现有的C++代码都将中断,因为所有代码都希望库位于全局命名空间中。解决方案是保留旧的“dot-h”头文件,并在没有扩展名的文件中提供命名空间库。这样,旧代码#include <iosteam.h>可以期望全局cout,而新代码可以#include <iostream>并期望std::cout。
namespace
#include <iosteam.h>
cout
#include <iostream>
std::cout
wnavrhmk5#
除了已经发布的好答案之外,应该注意的是,C++标准不需要指令“#include <iostream>“来读取名为“iostream”或甚至“iostream. h”的文件。它可以被命名为“fuzzball”。或者,没有相应的文件可能存在,并且定义被内置到编译器中并由include指令激活。
<iostream>
h9vpoimq6#
我的理解是#include tuple将“指向”tuple. h。看看这个:iostream vs iostream.h
xfyts7mz7#
各位,我认为这是:#include allwaysprepends /lib/include到搜索路径(.h是infrred),而#include<lib.h>搜索只是-I。请注意,我可能是错的……这只是我认为它是如何工作的(在Solaris上的Forte cc中)。
7条答案
按热度按时间yb3bgrhw1#
C++标准头文件没有“.h”后缀。我相信原因是有许多不同的标准前实现,标准会破坏。因此,与其要求供应商更改现有的“iostream. h”(例如)标头符合标准(这将破坏他们现有的用户代码),标准委员会决定他们将删除后缀(我相信当时没有现有的实现已经这样做了)。
这样,现有的非标准程序将继续使用供应商的非标准库。当用户希望使他们的程序符合标准时,他们将采取的步骤之一是更改“
#include
“指令以删除“.h”后缀。所以
字符串
正如其他答案所提到的,非标准库的作者可以选择任何一种命名约定,但我认为他们会继续使用“.h”或“.hpp”(就像Boost所做的那样),原因有几个:
1.如果库被标准化,标准版本不会自动覆盖以前的非标准版本(很可能导致用户代码损坏)。
1.这似乎是一个约定(或多或少),没有后缀的头文件是标准库,而那些有后缀的(除了C兼容性头文件)是非标准的。
请注意,当委员会向STL添加散列Map时,也发生了类似的问题--他们发现已经有很多散列Map了,(不同的)
hash_map
实现,所以他们没有提出一个标准的,打破了很多东西在那里今天,他们称之为标准实现“unordered_map
“。空间应该有助于防止这种类型的跳跃通过箍,但它似乎工作得不够好(或者使用得不够好),无法让他们在不破坏大量代码的情况下使用更自然的名称。请注意,对于'C'头文件,C++允许您包含
<cxxxxxx>
或<xxxxxx.h>
变体。以'c'开头且没有“.h”后缀的变体将其声明放在std
命名空间中(也可能在全局命名空间中);带有“.h”后缀的文件将名称放在全局名称空间中(也可能放在std
名称空间中)。qvk1mo1f2#
如果文件名为
tuple
,则需要#include <tuple>
如果文件名为tuple.h
,则需要#include <tuple.h>
就这么简单。你不能省略任何扩展。
xv8emn3q3#
它包含一个简单命名为“tuple”的文件--该文件本身没有扩展名。
C++包含文件的假定标准是不带.h扩展名命名它们;许多库编写者遵循这个标准(STL等),但有些不遵循。
qaxu7uf24#
没有什么特别的事情发生。文件只是简单地命名为
tuple
。标准库头没有文件扩展名的原因是因为
namespace
s。命名空间是在C98标准的后期添加到C标准中的,包括所有标准库实体所在的
std
命名空间。当标准库被移动到
std
命名空间时,这意味着所有现有的C++代码都将中断,因为所有代码都希望库位于全局命名空间中。解决方案是保留旧的“dot-h”头文件,并在没有扩展名的文件中提供命名空间库。这样,旧代码
#include <iosteam.h>
可以期望全局cout
,而新代码可以#include <iostream>
并期望std::cout
。wnavrhmk5#
除了已经发布的好答案之外,应该注意的是,C++标准不需要指令“#include
<iostream>
“来读取名为“iostream”或甚至“iostream. h”的文件。它可以被命名为“fuzzball”。或者,没有相应的文件可能存在,并且定义被内置到编译器中并由include指令激活。h9vpoimq6#
我的理解是#include tuple将“指向”tuple. h。
看看这个:iostream vs iostream.h
xfyts7mz7#
各位,
我认为这是:#include allwaysprepends /lib/include到搜索路径(.h是infrred),而#include<lib.h>搜索只是-I。
请注意,我可能是错的……这只是我认为它是如何工作的(在Solaris上的Forte cc中)。