23

4 つのファイル (2 つのヘッダーと 2 つのコード ファイル) があります。FileA.cpp、FileA.h、FileB.cpp、FileB.h

FileA.cpp:

#include "FileA.h"

int main()
{
    hello();
    return 0;
}

void hello()
{
    //code here
}

ファイルA.h:

#ifndef FILEA_H_
#define FILEA_H_
#include "FileB.h"
void hello();

#endif /* FILEA_H_ */

FileB.cpp:

#include "FileB.h"

void world()
{
    //more code;
}

FileB.h:

#ifndef FILEB_H_
#define FILEB_H_

int wat;
void world();


#endif /* FILEB_H_ */

(Eclipse で) コンパイルしようとすると、「'wat' の複数の定義」が表示されます。理由はわかりませんが、問題なく動作するはずです。

4

5 に答える 5

38

すべての詳細を含めるつもりはありませんがwat、コンパイル uint でグローバル変数を 2 回定義します。

修正するには、次を使用します。

FileB.h

extern int wat;

FileB.cpp

int wat = 0;

この ( ) は、変数がどこかに存在し、それを自分で見つける必要があることをexternコンパイルに伝えます(この場合は にあります)watFileB.cpp

于 2012-06-17T15:01:43.090 に答える
15

ヘッダーで変数を宣言しないでください。#includeファイルの内容を文字通りコピーして他のファイルに貼り付けます (つまり、実行するファイル#include "FileB.h"は FileB.h の内容を文字通りコピーします。int watつまり、実行するすべてのファイルで定義されます#include "FileB.h")。

FileA.cppからアクセスしたい場合wat、それが FileB.cpp で宣言されている場合は、FileA.cpp のようexternにマークすることができます。

于 2012-06-17T15:02:07.383 に答える
3

私は今答えを見つけました(ファイルを次々と見るのが助けになったと思います)問題は、コンパイラがwatの定義を持つFileB.oを作成し、次にFileA.cppでFilB.oをコンパイルしようとすることです。 FileA.h には FileB.h のインクルードがあり、wat の定義も含まれます。

于 2012-06-17T15:01:44.427 に答える
2

watはファイル スコープで宣言され、2 つのソース ファイルで 2 回表示されるため、複数の定義を取得します。

代わりに、変数宣言externを行い、正確に1 つのソース ファイルで定義してください。

extern int wat;  // In FileB.h

int wat;   // In FileB.cpp
于 2012-06-17T15:01:23.517 に答える
0

その wat 変数宣言は、cpp ファイルに属すべき定義です。関数本体をヘッダーに入れるようなものです。

extern を wat 宣言の前に置き、現在の宣言を extern なしで cpp ファイルの 1 つにコピーする必要があります。

于 2012-06-17T15:00:52.573 に答える