6

file1.c と file2.c という名前の 2 つのソース ファイル (.c) があり、それらの間で変数を共有する必要があります。そのため、一方のソース ファイルで変数が更新された場合、もう一方のソース ファイルでこの変数にアクセスすると、その変更が変更されます。見られます。

私がしたことは、file3.c と呼ばれる別のソース ファイルと file3.h と呼ばれるヘッダー ファイルを作成することです (もちろん、これは file1.c file2.c と 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
.
.
.

しかし、問題は in file1.cupdate が呼び出され、myvariable が更新されたときに変更が表示されないことです。file2.cこれは、file2.c で get が呼び出されて myvariable が出力されたときに 0 が出力され、file2.c で update が呼び出されて変更が呼び出された場合にのみ、変更が表示されるためです。見られました。変数は共有されているようですが、ソースファイルごとに、この変数には異なる変数値/異なるメモリがあります

4

4 に答える 4

3

変数が必要な場合は、変数を other ファイルでexternとして宣言できます...

于 2012-04-27T17:53:28.347 に答える
2

コードが乱雑になるため、変数を避けることをお勧めしexternます-そのグローバルを使用するすべてのファイルで extern を繰り返します。通常は、グローバル変数を .xml にすることで、何らかのファイル スコープにバインドすることをお勧めします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
于 2012-04-27T18:27:34.183 に答える
2

file3.hfile1.c と file2.c に含める

于 2012-04-27T17:54:24.617 に答える
2

ここで考えられる解決策は 1 つだけです。これを行うと、変数はアプリケーション全体に対してグローバルではなく、アクセス関数を使用してのみ読み書きできます。ご不明な点がございましたら、お知らせください。

ファイル: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);
}

ファイル: access.c

#include "access.h"

static int variable = 0;


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

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

ファイル: file2.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 );
}

ファイル: access.h

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

そして、実行出力は次のとおりです。

[root@jrn SO]# ./test
1
getValue:: 1
after getValue:: 2
getValue:: 3
after getValue:: 4
4

これが役立つことを願っています。

于 2012-04-27T19:16:14.390 に答える