1

私は以前にこれを尋ねましたが、私は言われたことを使用して、プログラムを機能させようとしました:

おそらく、私は C++ に慣れていないためですが#ifndef、クラスに同じ .h ファイルが含まれているという問題が原因で、使用に問題があります。sh と th と main.cpp の両方に、rh で定義された構造体が必要です。

私は持っている

#include "s.h"
#include "t.h"

#ifndef r
#include "r.h"
#endlif

私のメインのcppファイルで

そして、私のshファイルとthファイルのそれぞれに、

#ifndef r
#include "r.h"
#endlif
// and then its class

同様に、私がrhファイルに持っているのは次のとおりですが、コンパイラはrhファイルで、、、についてエラーを出していexpected nested-name-specifier before "namespace"ますunqualified id before using namespace std;expected ';' before "namespace"

#include <iostream>

using namespace std;
struct r{
// code
};

メイン cpp が特定のライブラリなどをインポートしないことによって引き起こされる問題はありますか? どうすれば修正できますか?

4

3 に答える 3

4

#ifndef複数回インクルードしないように、ヘッダー ファイルに移動する必要があります。したがって、sh は次のようになります。

#ifndef S_H
#define S_H

// All of your s.h declarations go here

#endif

rh は次のようになります。

#ifndef R_H
#define R_H

// All of your r.h declarations go here

#endif

等々。

これにより、ヘッダー ファイルが複数回インクルードされるのを防ぎます。同じヘッダー ファイルを 1 つのコンパイル ユニットに複数回含めると、コンパイラは、同じシンボルが複数回宣言されていると警告する可能性があります。また、同じヘッダーのコレクションが再帰的に含まれている場合、コンパイル中に無限ループが発生する可能性もあります。

于 2010-11-10T02:58:37.727 に答える
0

#includeやのようなコンパイラ ディレクティブ#ifdefは、実際には C とは異なるプログラミング言語である「C プリプロセッサ」の一部ですstruct r。rhで次のようなものが必要です:

#include <iostream>
#define r
using namespace std;
struct something_that_isnt_called_just_r{
// code
};

そのため、@andand で記述されている従来のインクルード ガードを使用したほうがよいでしょう。

于 2010-11-10T03:12:09.017 に答える
0

質問を簡単にするために、r、s、および t を使用していることを願っています。

「struct r」を含むステートメントがプログラムの r を定義していると考えている可能性はありますか?

これらは 2 種類の定義です。1 つは構造体定義ですが、定義を使用したい場合:

#ifndef R_H
#define R_H
#include <iostream>

using namespace std;

struct r{
//code
};

#endif

(andandがすでに指摘したように)

注: 混乱を避けるために、r の代わりに定義 R_H を使用しています。構造体に r を使用し、ヘッダーの定義に R_H を使用します (実際には、モジュールの名前 + "_H")。

于 2010-11-10T03:10:47.127 に答える