2

BOT_TIME私のゲームの難易度に応じて変化するという変数が1つありますが、そうではありませんconst。それを使用する多くのファイルがあります。グローバル変数として使用するつもりです。

1)私はそれconstants.hを宣言しextern int BOT_TIMEます。で、私はそれconstants.cppを宣言しextern int BOT_TIMEます。

BUILD =>すべてのソースの変数への未定義の参照(はい、ヘッダーを含めました)。

2)私はそれconstants.hを宣言しint BOT_TIMEます。で、私はそれconstants.cppを宣言しint BOT_TIMEます。non-constsはデフォルトなのでextern、そのキーワードを残すことにしました。

BUILD =>変数の複数の定義(constants.hが含まれている各ソースファイルに表示されます)

3)私はそれconstants.hを宣言しextern int BOT_TIMEます。で、私はそれconstants.cppを宣言しint BOT_TIMEます。

これは機能します。

問題はどこにありますか?

変数をで何かに初期化するconstants.cppと、ケース1と3で機能します。

これは何が起こっているのですか?どちらが正しいアプローチですか?

4

3 に答える 3

3

変数は何度でも宣言できますが、一度だけ定義する必要があります。

extern int BOT_TIME;

宣言です。

int BOT_TIME;

定義です。

定義は、単一の実装ファイルに含まれている必要があります。

非 const はデフォルトで extern であるため、そのキーワードを残すことにしました。

いいえ。どうやってわかったの?

質問に答えるには:

1) 定義はなく、宣言のみです。

2) 仮定が間違っています。シンボルを複数回定義します。

3)それが正しい方法であるため、機能します。

コメントから:

で変数を宣言するときはextern、外部リンケージがあることを指定しますが、宣言するだけで、定義はしません。externキーワードを付けずにそのままにしておくと、まだ外部リンクがありますが、それも定義です。

于 2012-09-17T08:21:47.490 に答える
2

ヘッダー ファイルで変数を宣言し、ソース ファイルで一度だけ定義する必要があります。
これを行う正しい方法は次のとおりです。

定数.h

//declare the symbol as extern
extern int BOT_TIME;

定数.cpp

#include "constants.h"
//define the symbol once and only once
int BOT_TIME;

XXXX.cpp

#include "constants.h"

//Include the header file which declares it extern in any source file 
//you want to access it
//use BOT_TIME

変数は何度でも宣言できますが、定義できるのは 1 回だけです。
変数を複数回定義すると、One Definition Ruleに違反します。

extern int BOT_TIME;

これは#1許可されますが、変数を定義しないため機能しません。すべてのextern変数を一度定義する必要があることに注意してください。そうしないと、コンパイラがその定義を見つけることができず、エラーが発生します。

異なる翻訳単位で同じシンボルを複数回定義すると、#21 つの定義規則に違反するため、リンカーは同じことを報告します。

#3それを行う正しい方法です。

よく読んでください:
定義と宣言の違いは何ですか?

于 2012-09-17T08:24:52.763 に答える
0
extern int x;     // declaration
int x;            // definition
extern int x = 3; // definition

一般に、ソース ファイルでx. 実際に object が存在するように、1 つのソース ファイルに 1つの定義が必要ですx

于 2012-09-17T13:34:27.430 に答える