0

ヘッダーファイルを書き込もうとしています。add(int x, y) return x+y; のような単純なヘッダーを書くことができます。. しかし、もっと複雑にしようとすると、Visual Studio でエラーが発生しました。エラーはに関連していると思います<fstream>。それは常に示しています

"エラー C2065: 'fstream': 宣言されていない識別子".

私のcppファイルの最初の行はvoid get_int(fstream& stream, int offset)(を除く#include<fstream>)で、.hファイルの最初の定義は

#ifndef GET_H
#define GET_H

int get_int(fstream& stream, int offset);

#endif

こんなふうになります。このコードの何が問題になっていますか?

4

2 に答える 2

3

これを行う必要があります:

#ifndef GET_H
#define GET_H

#include <fstream>

int get_int(std::fstream& stream, int offset);

#endif

#include <fstream>と追加されたstd::プレフィックスに注意してください。すべてのC++標準ライブラリ...もの...がその名前空間で定義されているため、資格が必要です。using namespace std;ヘッダーにまたはを追加しないでください。これusing std::fstream;は、グローバル名前空間を汚染し、存在の目的を損なうためですnamespace std。ヘッダーを含む人々は、他の人が使用する名前空間と競合する可能性があるものがグローバル名前空間に取り込まれることを期待していません。 。

于 2012-06-24T13:29:06.673 に答える
2
#include <fstream>

ヘッダーファイルにもある必要があります。これはインクルード翻訳単位に入りますが、.cpp ファイル内で展開すると fstream の #include の上になるため、まだそれを確認する必要があります。このようにして、包含ガードが配置されているため、順序がコンパイルに影響しないようにします。2 回展開しようとはしません。また、#pragma once子猫を救います。

注文で同じエラーが発生する理由は、ヘッダーに「using std::goeshere」などがないためです。

コメントのフォローアップとしてのコード サンプル (名前空間の汚染の防止):

#ifndef GET_H
#define GET_H

#include <fstream>
using std::fstream;

int get_int(fstream& stream, int offset);

#endif

または (#pragma once はすべての適切なコンパイラでサポートされている必要があります)

#pragma once

#include <fstream>
using std::fstream;

int get_int(fstream& stream, int offset);
于 2012-06-24T13:16:08.193 に答える