3

次の構造が必要なプロジェクトに取り組んでいます。 ここに画像の説明を入力してください

2つのCPPファイルにはクラスが含まれており、これらのクラスにはHファイル1にあるネイキッド関数が必要です。クラスとネイキッドにはHファイル2にある変数が必要です。

CPPファイルを分割して、nakesと必要な変数を含む2つの別々のファイルを使用することができます。しかし、私はこの構造を使用することを好みます。

コンパイラが#ifndefコマンドをスキップしているようです。問題をテストしました。

主要:

#include <iostream>

//1>CPPFile2.obj : error LNK2005: "bool Test1" (?Test1@@3_NA) already defined in CPPFile1.obj
//1>CPPFile2.obj : error LNK2005: "bool Test2" (?Test2@@3_NA) already defined in CPPFile1.obj

int main()
{
}

CPPファイル1:

#include <iostream>
using namespace std;

#include "HFile1.h"

CPPファイル2:

#include <iostream>
using namespace std;

#include "HFile2.h"

HFile 1:

#include "HFile2.h"

#pragma once
#ifndef Name1
#define Name1

//Use test1, this workes fine
//Use test2, this workes fine

#endif

HFile 2:

#pragma once
#ifndef Name2
#define Name2

bool Test1 = false;
bool Test2 = false;

#endif

#ifndef #define #endif構造が正しく機能しない可能性はどのようにありますか?

4

3 に答える 3

6

問題は、2 番目のヘッダーが変数を宣言するだけでなく、変数を定義していることです。プログラムには単一の定義が必要なため、コンパイルは失敗します。インクルード ガードは単一の翻訳単位内でのみ保護するため、これはインクルード ガードとは関係ありません。あなたの場合、.cpp ファイルのそれぞれにヘッダーが含まれているため、同じ変数を個別に定義しています。

解決策は、ヘッダーで変数のみを宣言し、それらを単一の翻訳単位で定義することです。

#ifndef Name2
#define Name2
extern bool Test1;
extern bool Test2;
#endif
// single .cpp
bool Test1 = false;
bool Test2 = false;

全体にコードの匂いがありますが。ソリューションの再設計が必要になる場合があります。ほとんどの場合、グローバル変数の使用は適切な解決策ではありません。

于 2012-08-26T14:48:22.570 に答える
3

リンクエラーが発生しています。これは、インクルード ガードとは関係ありません。両方のオブジェクト ファイルでTest1とを定義しました。代わりに、1 つのオブジェクト ファイルだけがそれを定義し、他のオブジェクト ファイルがそれを定義Test2するようにする必要があります。extern

于 2012-08-26T14:48:08.557 に答える
1

ヘッダーで変数を定義しないでください。.cpp で定義する必要があります。別の .cpp ファイルからアクセスする場合は、「extern」を含むヘッダーを作成します。

File1.cpp

bool Test1 = false; //define a var in your .cpp

File1.h

extern bool Test1; //extern it in your header

File2.cpp

#include "File1.h" //include the header of the variable

void Somefunction()
{
    if (Test1) //use the variable
    {
    //someting 
    }

}

ただし、通常、グローバル変数を使用するのは悪い習慣です...

于 2012-08-26T14:56:53.167 に答える