0

General.h の内部

#ifndef GENERAL
#define GENERAL
namespace counternamespace{
    int upperbound;
    int lowerbound;
}
#endif

Analyzer.h の内部

#ifndef ANALYZER
#define ANALYZER
#include"General.h"

class Analyzer
{
public :
     int var ;
     int func();
};
#endif

Test.h の内部

#ifndef TEST
#define TEST
#include"Analyzer.h" //Error
class Test2
{
public:
    Test2(void);

public:
    ~Test2(void);
};
#endif

上記のコードでは、Analyzer を追加しない場合、Test.hすべて正常に動作しています。しかし、追加した後、次のリンカーエラーが表示されます。

1>Test2.obj : error LNK2005: "int counternamespace::lowerbound" (?lowerbound@counternamespace@@3HA) already defined in Analyzer.obj
2>Test2.obj : error LNK2005: "int counternamespace::upperbound" (?upperbound@counternamespace@@3HA) already defined in Analyzer.obj

#ifndef/を追加しました#endif。次に、どこで間違いを犯していますか?誰でも私に知らせてもらえますか?

4

3 に答える 3

2

ええ、アロクは正しいです。おそらく、Analyser.cpp と Test2.cpp があり、どちらも異なるコンパイル ユニットです。電話すると

g++ Analyser.cpp Test2.cpp

コンパイラは実際には Analyser.obj と Test2.obj を別々に作成し、それらをリンクします。コンパイラが Analyser.obj と Test2.obj をリンクしようとすると、Test2.obj の 2 つの変数が Analyser.obj にも存在することがわかります。

#defineディレクティブは単一のコンパイル ユニットにしか存在しないため機能しません。そのため、General.h は Analyser.obj と Test2.obj の両方に含まれています

このような重複を避けるために、ソリューションは名前空間変数を関数でラップしています。こんなふうになります:

General.h の内部

#ifndef GENERAL
#define GENERAL
namespace counternamespace{
    int& upperbound();
    int& lowerbound();
}
#endif

General.cpp内

#include "General.h"
namespace counternamespace{
  int& upperbound(){static int local; return local;}
  int& lowerbound(){static int local; return local;}
}

だから今言えること

counternamespace::upperbound()=3;
counternamespace::lowerbound()=1;

そしてそれはあなたが言ったのと同じ意味です

counternamespace::upperbound = 3;
counternamespace::lowerbound = 1;

コンパイラは関数呼び出しを最適化するので、オーバーヘッドもありません。

于 2012-12-31T10:38:00.287 に答える
1
Inside General.h

#ifndef GENERAL
#define GENERAL
namespace counternamespace{
    extern int upperbound;
    extern int lowerbound;
}
#endif

Inside General.cpp

#include"General.h"
using namespace counternamespace ;
int counternamepace::upperbound = 12;
int counternamepace::lowerbound = 12;

次に、必要なことを行います。

于 2013-01-01T17:49:57.307 に答える
1

ヘッダー ファイルで変数を定義しないでください。
変数のコピーが各翻訳単位に作成されます。ヘッダー ファイルを他のファイルに含めると、1 つの定義規則に違反し、リンク エラーが発生します。

于 2012-12-31T10:27:03.943 に答える