6

C++ プロジェクト用の aplusb(int, int) 関数を含む単純な UTIL.h ファイルを作成しています。しかし、コンパイルできず、エラー メッセージは「aplusb(int, int)」の複数定義に関するものです。エラーを修正するのを手伝ってくれますか、それともヒントを教えてください。

詳細な参照用に、ここに私のプロジェクトを添付します。

ファイル UTIL.h

#ifndef UTIL_H_
#define UTIL_H_

int aplusb(int a, int b) {
    return a + b;
}

#endif /* UTIL_H_ */

ファイル ClassA.h

#ifndef CLASSA_H_
#define CLASSA_H_

class ClassA {
public:
    ClassA();
    virtual ~ClassA();
private:
    int sum;
};

#endif /* CLASSA_H_ */

ファイル ClassA.cpp

#include "ClassA.h"
#include "UTIL.h"

ClassA::ClassA() {
    // TODO Auto-generated constructor stub
    sum = aplusb(3,5);

}

ClassA::~ClassA() {
    // TODO Auto-generated destructor stub
}

ファイル ClassB.h

#ifndef CLASSB_H_
#define CLASSB_H_

class ClassB {
public:
    ClassB();
    virtual ~ClassB();
private:
    int sum;
};

#endif /* CLASSB_H_ */

ファイル ClassB.cpp

#include "ClassB.h"
#include "UTIL.h"

ClassB::ClassB() {
    // TODO Auto-generated constructor stub
    sum = aplusb(5,6);
}

ClassB::~ClassB() {
    // TODO Auto-generated destructor stub
}

コンパイル エラー メッセージ

ClassB.o: In function `aplusb(int, int)':
/home/vtvan/Desktop/workspace/commonfunc/UTIL.h:11: multiple definition of `aplusb(int, int)'
ClassA.o:/home/vtvan/Desktop/workspace/commonfunc/UTIL.h:11: first defined here
collect2: error: ld returned 1 exit status
make: *** [commonfunc] Error 1
4

5 に答える 5

18

最初のバリアント -inline指定子を使用

#ifndef UTIL_H_
#define UTIL_H_

inline int aplusb(int a, int b) {
    return a + b;
}

#endif /* UTIL_H_ */

2 番目のバリアント - 定義を.cppファイルに書き込みます。

于 2013-05-06T09:53:10.073 に答える
5

インクルード ファイルに関数 aplusb を作成しました。これは、それをインクルードするすべてのファイルに対して、パブリック関数 aplusb が作成され、名前の競合が発生することを意味します。

関数をインラインにする必要がある場合は、そのようにマークします。関数がテンプレートである必要がある場合は、そのようにマークします。関数があなたが書いた通りでなければならない場合は、それを cpp ファイルに入れて、プロトタイプを h ファイルに保存してください。

.h
#ifndef UTIL_H_
#define UTIL_H_

int aplusb(int a, int b);

#endif

.cpp
int aplusb(int a, int b)
{
    return a+b;
}
于 2013-05-06T09:55:27.337 に答える
2

ヘッダー ファイルで aplusb 関数を宣言し、cpp ファイルで定義を提供する必要があります。何かのようなもの

util.h:

#ifndef UTIL_H_
#define UTIL_H_

int aplusb(int, int);

#endif /* UTIL_H_ */

エラー メッセージは、util.h ファイルをインクルードするたびに関数を再定義していることを示しています。これはまさにあなたが行っていることです :-) これはODR (1 つの定義ルール)に違反しています。これは、(この場合は関数の) 定義が一意でなければならないことを示しています。そうしないと、コンパイラーは代替案を選択できなくなります (この場合のように、たまたま等しい場合でも)。

テンプレートは問題を少し複雑にすることに注意してください (要するに、テンプレートはインスタンス化されるまでは定義ではないため)。

于 2013-05-06T10:01:42.710 に答える
0

ヘッダー ファイルは、実際の関数を含めることを意図したものではありません (テンプレートなどの特定の C++ の側面は無視されます)。あなたの場合の一般的な慣行では、UTIL.H を変更して関数 ( int aplusb(int a, int b);) のプロトタイプを作成し、その実装をソース ファイルに移動する必要があります。

于 2013-05-06T09:53:26.550 に答える
0

すべての関数が静的に宣言されている Util 構造体を作成することもできます。その後、次を使用してすべての機能にアクセスできますUtil::<function name>

ファイル UTIL.h

#ifndef UTIL_H_
#define UTIL_H_

struct Util{
    static int aplusb(int a, int b) {
        return a + b;
    }
};

#endif /* UTIL_H_ */

ファイル ClassA.cpp

#include "ClassA.h"
#include "UTIL.h"

ClassA::ClassA() {
    sum = Util::aplusb(3,5);
}

ClassA::~ClassA() {
}

ファイル ClassB.cpp

#include "ClassB.h"
#include "UTIL.h"

ClassB::ClassB() {
    sum = Util::aplusb(5,6);
}

ClassB::~ClassB() {
}
于 2016-08-26T13:20:18.787 に答える