0

私はC++が初めてで、ヘッダーを見つける方法を理解しようとしています。もともと、ソースコードに含めることができるクラスを見つけようとしていただけでした。異なるコンパイラは異なるインクルード ディレクトリを使用するため、クラスの可用性は異なると思います。私の計画は、コンパイラが使用していた「include」ディレクトリを見つけて、そこに何でも含めることができると仮定することでした。だから私は行くにつれてますます混乱しています。

まず、Windows 7 の Code::Blocks で C++ コードを書いています。IDE はコンパイルに GNU GCC を使用するように設定されています。これは、C++ コードに G++ コンパイラを使用することを意味します。ここでコンパイラを見つけました: C:\MinGW\bin\mingw32-g++.exe, Code::Blocks 設定はそれを指しています。

したがって、G++ は C:\MinGW\include を再帰的に使用してすべてのヘッダーを検索する必要があると想定しました。私の理論をテストするために、「iostream.h」を検索しました。驚いたことに、私の C ドライブには「iostream.h」すらありません。それにもかかわらず、それを含めると、私のコードはコンパイルされて機能します。

だから私の質問:

  1. ハードドライブにない場合でも、G++ はどのようにして iostream ヘッダーを見つけるのですか?

  2. すべての標準 C++ ヘッダー ( http://msdn.microsoft.com/en-us/library/ct1as7hw.aspxに記載) は、すべての C++ コンパイラで使用できますか? ソースコードを変更する必要がないように、まったく同じ名前を使用しますか?

4

4 に答える 4

3

2 番目の質問に関しては、標準では、ヘッダーをファイルとして使用できるようにする必要はありません。プログラムにディレクティブが存在する必要が#includeあり、コンパイラは、標準が必要とする宣言がプログラムに存在するかのように動作する必要があります。ただし、コンパイラは、適切と思われる方法で自由に宣言を挿入できます。

そうは言っても、特に g++ には、各ヘッダーをバックアップするファイルがあります。特定の構成がわからないと、ヘッダーがどこにあるのかわかりませんが、プリプロセッサーのにコンパイルプロセスを停止して、出力を調べることができます。

$ cat test.cpp
#include <iostream>
int main() {
   std::cout << "Hi\n";
}
$ g++ -E test.cpp | head -10
# 1 "test.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.cpp"
# 1 "/usr/include/c++/4.2.1/iostream" 1 3
# 42 "/usr/include/c++/4.2.1/iostream" 3

# 43 "/usr/include/c++/4.2.1/iostream" 3

上記のパスは MacOSX Lion 上にあり、この特定の構成iostreamに から含まれていることを示しています/usr/include/c++/4.2.1/iostream。Windowsheadでは使用できない場合がありますが、出力をファイルにリダイレクトして、そこから読み取ることができます。

于 2012-06-02T01:03:29.740 に答える
1

1)iostream.hが見つからない理由は、そのようなヘッダーがないためですiostream。標準のC++でスペルされています。試し#include <iostream.h>てみると失敗するので、持っていないヘッダーは見つかりません:)

実行g++ -v test.cppすると、コンパイル時にヘッダーを探すために使用するすべてのパスが表示されますtest.cpp

2)はい、コンパイラによって名前が異なるか、欠落している場合、標準ヘッダーにはなりません。

于 2012-06-02T01:13:34.723 に答える
1
  1. 引用符を使用すると、山かっこで検索するディレクトリに移動する前に、現在のディレクトリが検索されます。にリストされているファイル以外のディレクトリがあります\include。それは、拡張子のないものを見つける場所です。それらのファイルが入ったフォルダーがあるかもしれませんがc++、Windows 7 検索を使用して CodeBlocks ディレクトリ内からそれらを検索しても、それらがどこにあるかがわかります。

  2. はい、それらはすべて同じ名前でアクセスできる必要があり、山かっこインクルードを使用してアクセスできます。もちろん、一部が欠落している可能性は常にわずかにあります。この場合、その実装は一見するとかなり信頼性がないように見えます。今日のすべての主要なコンパイラは、これに確実に準拠する必要があります。

クラスで独自のヘッダーを使用するには、メインの cpp ファイルと同じディレクトリにある必要があり、引用符を使用する必要があります。

于 2012-06-02T00:52:16.753 に答える
0

回答 1: Code::Blocks を使用したことはほとんどありませんが、Dev-C++ と MSVC++ で覚えている限りでは、ヘッダーは IDE のディレクトリにあります。(たとえば、私の MSVC++ インクルード ディレクトリは C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include にあり、iostream ファイルがあります。)

回答 2: 最も一般的なヘッダー ファイルは、最も一般的な IDE の / コンパイラのセットにあります。

ヒント: 「iostream.h」ではなく「iostream」のことでしたか?

于 2012-06-02T00:57:38.753 に答える