web-dev-qa-db-ja.com

Cの共有グローバル変数

Cで共有されるグローバル変数を作成するにはどうすればよいですか?ヘッダーファイルに配置すると、リンカーは変数が既に定義されていると文句を言います。 Cファイルの1つで変数を宣言し、それを使用する他のすべてのCファイルの先頭にexternsを手動で配置する唯一の方法はありますか?それは理想的ではないようです。

76
Claudiu

ヘッダーファイルにexternを使用して書き込みます。そして、cファイルの1つのグローバルスコープで、externなしで宣言します。

57
DiGMi

1つのヘッダーファイル(shared.h):

extern int this_is_global;

このグローバルシンボルを使用するすべてのファイルに、extern宣言を含むヘッダーを含めます。

#include "shared.h"

複数のリンカー定義を回避するには、コンパイル単位全体にグローバルシンボルの宣言が1つだけ存在する必要があります(例:shared.cpp):

/* shared.cpp */
#include "shared.h"
int this_is_global;
87
Hernán

ヘッダーファイル内

ヘッダーファイル

#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"
22
jim mcnamara

宣言をヘッダーファイルに入れます。

 extern int my_global;

.cファイルの1つで、グローバルスコープで定義します。

int my_global;

my_globalへのアクセスを必要とするすべての.cファイルには、extern inを持つヘッダーファイルが含まれます。

15
nos

CとC++の間でコードを共有している場合は、shared.hfileに以下を追加することを忘れないでください。

#ifdef __cplusplus
extern "C" {
#endif

extern int my_global;
/* other extern declarations ... */

#ifdef __cplusplus
}
#endif
4
tritinia

ヘッダーファイルが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で一般的なキーワードを使用しないでください。

2
ivan