48

gmock をいじっていて、次の行が含まれていることに気付きました。

#include <tuple>

私は期待していたでしょうtuple.h

拡張機能を除外してもよいのはいつですか? また、ディレクティブに別の意味を与えるのですか?

4

7 に答える 7

67

C++ 標準ヘッダーには、「.h」サフィックスがありません。その理由は、標準が破られる前標準の実装が多数あったためだと思います。そのため、ベンダーが既存の「iostream.h」(たとえば) ヘッダーを標準に準拠するように変更することを要求する代わりに (既存のユーザーのコードが壊れる可能性があります)、標準委員会はサフィックスを削除することを決定しました (これは、私は信じていません)。その場合、既存の実装はすでに行われています)。

そうすれば、既存の非標準プログラムは、ベンダーの非標準ライブラリを使用して引き続き機能します。ユーザーが自分のプログラムを標準に準拠させたい場合、ユーザーが実行する手順の 1 つは、" #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)

他の回答が述べたように、非標準ライブラリの作成者はいずれかの命名規則を選択できますが、いくつかの理由で (Boost が行ったように) 「.h」または「.hpp」を引き続き使用したいと考えています。

  1. &ライブラリが標準化された場合、標準バージョンは以前の非標準バージョンを自動的にオーバーライドしません(おそらくユーザーコードが壊れる可能性があります)
  2. サフィックスのないヘッダーは標準ライブラリであり、サフィックスのあるヘッダー (古い C ヘッダー以外) は非標準であるというのは (多かれ少なかれ) 慣例のようです。

委員会がハッシュ マップを STL に追加しようとしたときに、同様の問題が発生したことに注意してください。委員会は、既に多くの (異なる)hash_map実装が存在することを発見しました。 、彼らは標準実装 " " を呼び出していますunordered_map。名前空間は、この種のフープを飛び越えるのを防ぐのに役立つはずでしたが、多くのコードを壊すことなく、より自然な名前を使用できるようにするのに十分に機能していないように見えました (または十分に使用されていませんでした)。

「C」ヘッダーの場合、C++ では、<cxxxxxx>または<xxxxxx.h>バリアントのいずれかを含めることができることに注意してください。「c」で始まり、「.h」接尾辞がないものは宣言をstd名前空間 (およびおそらくグローバル名前空間) に配置し、「.h」接尾辞を持つものは名前をグローバル名前空間に配置します (一部のコンパイラも名前を名前空間に入れstdます-それが標準に準拠しているかどうかはわかりませんが、害はありません)。

于 2009-01-14T02:14:02.203 に答える
20

ファイルに名前が付けられている場合は、名前が付けられて いる場合にtuple必要です#include <tuple>tuple.h#include <tuple.h>

それはそれと同じくらい簡単です。拡張子を省略していません。

于 2009-01-14T01:25:44.063 に答える
15

単に「タプル」という名前のファイルが含まれています-ファイル自体には拡張子がありません。

C++ インクルード ファイルの推定上の標準は、拡張子 .h を付けずに名前を付けることです。多くのライブラリ作成者はこの標準 (STL など) に従いますが、そうでないものもあります。

于 2009-01-14T01:27:34.010 に答える
8

特別なことは何も起こっていません。ファイルの名前は単純にtuple.

この理由は...標準ライブラリのヘッダーにファイル拡張子がないのは、namespaces.

std名前空間は、すべての標準ライブラリ エンティティが存在する名前空間を含む、C++98 標準でゲームの後半に C++ 標準に追加されました。

標準ライブラリがstd名前空間に移動されたとき、それはすべての既存の C++ コードが破損することを意味しました。これは、すべてのライブラリがグローバル名前空間にあることを期待していたためです。解決策は、古い "dot-h" ヘッダー ファイルをそのままにして、拡張子のないファイルで名前空間付きライブラリを提供することでした。

このように、古いコード#include<iosteam.h>はグローバルを期待でき、cout新しいコードは.#include<iostream>std::cout

于 2009-01-14T02:57:14.113 に答える
5

<iostream>すでに投稿された細かい回答に加えて、C++ 標準では、「iostream」または「iostream.h」という名前のファイルを読み取るためにディレクティブ「 #include 」が必要ないことに注意してください。それは「ファズボール」と名付けることができます。または、対応するファイルが存在せず、定義がコンパイラーに組み込まれ、include ディレクティブによってアクティブ化される場合があります。

于 2009-01-14T02:59:31.673 に答える
4

私の理解では、#include tuple は tuple.h を「指す」ということでした。

これをチェックしてください: iostream と iostream.h

于 2009-01-14T01:35:07.647 に答える
-3

皆さん、

#include <lib>は常に /lib/include を検索パスの先頭に追加します (.h は無視されます) のに対し、#include <lib.h> は -I<pathname> のみを検索します

私が間違っている可能性があることに注意してください...それは私がどのように機能すると思うかです(SolarisのForte ccで)。

于 2009-05-23T10:10:15.357 に答える