Cで共有されるグローバル変数を作成するにはどうすればよいですか?ヘッダーファイルに配置すると、リンカーは変数が既に定義されていると文句を言います。 Cファイルの1つで変数を宣言し、それを使用する他のすべてのCファイルの先頭にextern
sを手動で配置する唯一の方法はありますか?それは理想的ではないようです。
ヘッダーファイルにextern
を使用して書き込みます。そして、cファイルの1つのグローバルスコープで、extern
なしで宣言します。
1つのヘッダーファイル(shared.h):
extern int this_is_global;
このグローバルシンボルを使用するすべてのファイルに、extern宣言を含むヘッダーを含めます。
#include "shared.h"
複数のリンカー定義を回避するには、コンパイル単位全体にグローバルシンボルの宣言が1つだけ存在する必要があります(例:shared.cpp):
/* shared.cpp */
#include "shared.h"
int this_is_global;
ヘッダーファイル内
ヘッダーファイル
#ifndef SHAREFILE_INCLUDED
#define SHAREFILE_INCLUDED
#ifdef MAIN_FILE
int global;
#else
extern int global;
#endif
#endif
ファイルを含むファイルで、グローバルを有効にします。
#define MAIN_FILE
#include "share.h"
Externバージョンが必要な他のファイル:
#include "share.h"
宣言をヘッダーファイルに入れます。
extern int my_global;
.cファイルの1つで、グローバルスコープで定義します。
int my_global;
my_global
へのアクセスを必要とするすべての.cファイルには、extern
inを持つヘッダーファイルが含まれます。
CとC++の間でコードを共有している場合は、shared.h
fileに以下を追加することを忘れないでください。
#ifdef __cplusplus
extern "C" {
#endif
extern int my_global;
/* other extern declarations ... */
#ifdef __cplusplus
}
#endif
ヘッダーファイルが1つだけのクリーンな方法があるため、保守が簡単です。グローバル変数を含むヘッダーでは、各宣言の前にキーワードを付けます(私は共通を使用します)
#define common
#include "globals.h"
#undef common
このような他のソースファイル
#define common extern
#include "globals.h"
#undef common
Globals.hファイル内の変数を初期化しないようにしてください。初期化された変数はexternキーワードでも外部として扱われないため、リンカーは文句を言います。 global.hファイルは次のようになります
#pragma once
common int globala;
common int globalb;
etc.
どのタイプの宣言でも機能するようです。もちろん、#defineで一般的なキーワードを使用しないでください。