2012-04-27 31 views
6

私は2つのソースファイル(.c)file1.cとfile2.cの間に変数 を共有する必要があります。そのため、1つのソースファイル内に変数が更新されていれば、それにアクセスするときに他のソースファイルvariableに変更が表示されます。私は何をしたかどのように変数とC言語で多くのソースファイル間のその値を共有する?

は(もちろん、FILE1.Cのfile2.cおよびfile3.cの中に含まれている)と呼ばれるfile3.h file3.cのヘッダファイルと呼ばれる別のソースファイル

in file3.c: 

int myvariable = 0; 

void update(){//updating the variable 

    myvariable++; 

} 

int get(){//getting the variable 

    return myvariable; 

} 

in file3.h: 

extern int myvariable; 

void update(void); 

int get(void); 

in file1.c: 
. 
. 
. 
printf("myvariable = %d",get());//print 0 
update(); 
printf("myvariable = %d",get());//print 1 
. 
. 
. 

in file2.c: 
. 
. 
. 
printf("myvariable = %d",get());//print 0 but should print 1 
. 
. 
. 
を作成しています

しかしfile1.c更新で呼び出されると、GETが呼び出されたときにMYVARIABLEは、変更が原因file2.cにfile2.cで見ることができない が更新され、 MYVARIABLEが、その後印刷されて0にのみfile2.cであれば、印刷されているときに問題があります更新が呼び出された後、変更が表示されます。 変数が共有されているように思えるが、各ソースファイルの変数を必要なときに他の人でexternがファイルとしてあなたは変数を宣言することができます別の変数値/この変数

+0

実行ファイルを作成するためにこれらのファイルをどのようにコンパイルしていますか? file1.cとfile2.cの – dpp

+0

も ​​"int myvariable;"と宣言していますか?貴方はするべきではない。 –

+0

私は誰かによって与えられたmakefileでそれらをコンパイルします。私は書いたように、file3.cとfile3.hだけで、それらを宣言しません。 –

答えて

3

のためのさまざまなメモリがあり...

+0

可能ですが、多くのグローバル変数を作成しない方が良い場合がよくあります。ファイルスコープ(静的)を持つように変数を作成し、そのファイルに必要に応じてアクセス関数を提供します。アプリケーションの残りの部分(異なるファイルとスコープから)は*アクセス関数を使用する必要があります。通常、よりクリーンな設計になり、デバッグやメンテナンスが容易になります。 – Chimera

2

はFILE1.Cとfile2.c

+0

私は "file3.h(file1.c file2.cとfile3.cに含まれています)と呼ばれる"と書いています。 " –

+0

申し訳ありませんが、' update'と'get'は関数の中で' int myvariable'を持っていますか?そうでない場合は、取得コードと更新コードを追加できます。 – keety

+0

void update(void){myvariable ++; } –

2

file3.hを含めるため、私は、コードをすっきりのextern変数を避けるためにお勧めします - そのグローバルを使用して、それぞれ、すべてのファイルに外部宣言を繰り返します。通常、グローバル変数をファイルスコープにバインドする方が、staticにする方が良いでしょう。そしてそれにアクセスするためにinterface関数を使用する。あなたの例では、次のようになります。

// in file3.h 
void update(int x); 
int get(void); 

// in file3.c: 
static int myVariable = 0; 

void update(int x){ 
    myVariable = x; 
} 

int get(){ 
    return myVariable; 
} 

// in other files - include file3.h and use 
// update()/get() to access static variable 
+0

ナンセンス。 'extern'変数の宣言は適切に' file3.h'に属しています。これはアクセス制御に関するあなたのメソッドであっても必然的に含まれます。コードクラッタはここで問題ではありません。 – kittemon

+1

私のメソッドは 'extern'変数を公開しません - それに読み書きするための関数は2つだけです。時にはそれも良いアプローチです。 –

+0

0x69 - 私のためには機能しません。 file1.cでこのアップデート(5)を呼び出してそこに印刷すると、5が印刷されますが、その後、file2.cからget()を呼び出して印刷すると、0が印刷され、5は表示されません。 –

2

これを行うと、変数はアプリケーション全体に対してグローバルではなく、アクセス関数を使用してのみ読み書きできます。ご質問がある場合はお知らせください。

ファイル:access.c access.h file2.c main.c
でコンパイル:gcc main.c file2.c access.c -o test
ラン:./test

ファイル:main.cの

#include <stdio.h> 
#include "access.h" 

int main(int argc, char *argv[]) 
{ 
    int value; 


    put(1); 
    printf("%d\n", get()); 

    put(getValue() + 1); 
    printf("%d\n", getValue()); 

    return(0); 
} 

ファイル:ファイル2:

#include "access.h" 

static int variable = 0; 


int get(void) 
{ 
    return(variable); 
} 

void put(int i) 
{ 
    variable = i; 
    return; 
} 

ファイルaccess.c .c

#include <stdio.h> 
#include "access.h" 


int getValue(void) 
{ 
    int i = get(); 

    printf("getValue:: %d\n", i); 

    put(++i); 
    printf("after getValue:: %d\n", get()); 
    return(i); 
} 

ファイル:

extern int getValue(void); 
extern int get(void); 
extern void put(int i); 

access.hそして、ここでは、実行出力です:

[[email protected] SO]# ./test 
1 
getValue:: 1 
after getValue:: 2 
getValue:: 3 
after getValue:: 4 
4 

私はこのことができます願っています。

関連する問題