3

プログラムに非常に単純なファイルシステムがあります。

worker.hを含む:main.cpp、worker.hを含むworker.cpp、worker.hを含むworker.cppがあります。

worker.h にはヘッダー ガードがあり、main.cpp と worker.cpp の両方で必要ないくつかの変数が宣言されており、いくつかの関数宣言があります。

#ifndef __WORKER_H_INCLUDED__
#define __WORKER_H_INCLUDED__

    bool x;
    int y;

    void somefunction( int w, int e );

#endif

他のスレッドと Google の結果を調べたところ、ヘッダー ガードは、複数のソース ファイルからではなく、単一のソース ファイル内の複数のインクルードからユーザーを保護することがわかりました。

したがって、リンカー エラーが発生する可能性があります。

私の質問は

  1. 関数ではなく変数だけに複数の定義エラーがあるのはなぜですか? 私の理解によると、これらは両方とも宣言されているだけで、ヘッダー ファイル worker.h で定義されていません。

  2. 複数定義リンカー エラーなしで、変数を main.cpp と worker.cpp の両方で使用できるようにするにはどうすればよいですか?

4

2 に答える 2

3

関数ではなく変数のみに複数の定義エラーがあるのはなぜですか?私の理解では、これらは両方とも宣言されているだけで、ヘッダーファイルworker.hでは定義されていません。

変数を定義したからです。このように、それらは宣言されるだけです:

extern bool x;
extern int y;

ただし、cppファイルでそれらを定義する必要があります。:

bool x = true;
int y = 42;
于 2012-12-03T09:15:11.840 に答える
0

の更新された回答。変数の導入により、inline非 const 名前空間スコープの変数を配置する必要がある正確な翻訳単位について心配する必要がなくなりました。一般的なグローバル変数の使用に関する議論はさておき、最新の C++ で OP を修正する別の方法は、次のように変数を宣言することです。

inline bool x; // Can add an initializer here too
inline int y;

これがヘッダーにあり、すべての TU がまったく同じ定義を参照している限り、実装はそれを解決し、それらの TU がすべてまったく同じ一意のオブジェクトを参照するようにします。

于 2019-04-07T08:06:17.273 に答える