Cの共有グローバル変数


82

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


独自のソースコード内で共有しますか?extern宣言を1つのヘッダーファイルに入れ、定義を別の(単一の)ソースに入れます。もちろん、これらはプロセススレッド間で共有されます。データのプロセス間共有には、IPCメカニズム(共有メモリ、パイプ)を使用します。
エルナン2010年



回答:


63

ヘッダーファイルにextern。を付けて記述します。そして、cファイルの1つのグローバルスコープで、extern。なしで宣言します。


1
代わりに、その* .cファイルのヘッダーファイルで宣言できますか?
ジェレミア2016年

91

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

extern int this_is_global;

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

#include "shared.h"

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

/* shared.cpp */
#include "shared.h"
int this_is_global;

IPCメカニズムについてさらに学ぶための好ましい参考資料はありますか?
NickO 2013

7
「あなたのグローバルシンボルの宣言を1つだけ...」にもっと重点を置いてください。グローバル変数を使用したいすべてのcファイルに宣言がありました:(
AntonioCS 2013

22

ヘッダーファイル内

ヘッダーファイル

#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"

ああ、これは私がしばらく前に持っていた解決策です-私はMAIN_FILEプリプロセッサ変数を忘れました。私はthinik私はcurが受け入れた答えがもっと好きです
Claudiu

15

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

 extern int my_global;

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

int my_global;

アクセスを希望するすべての.cファイルにmy_globalは、externinを含むヘッダーファイルが含まれます。


5

CとC ++の間でコードを共有している場合は、shared.hファイルに次を追加することを忘れないでください。

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

2

ヘッダーファイルが1つしかないクリーンな方法があるため、保守が簡単です。グローバル変数を含むヘッダーで、各宣言の前にキーワードを付けます(私はcommonを使用します)。その後、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で共通のキーワードを使用しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.