6

我有 2 个名为 file1.c 和 file2.c 的源文件 (.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
.
.
.

但问题是当file1.c调用 in update 并更新 myvariable 时,无法看到更改,file2.c因为在 file2.c 中调用 get 并打印 myvariable 然后打印 0,只有在 file2.c 中调用 update 然后更改被看到了。似乎该变量是共享的,但是对于每个源文件,该变量都有不同的变量值/不同的内存

4

4 回答 4

3

当您需要变量时,您可以在其他文件中将变量声明为extern ...

于 2012-04-27T17:53:28.347 回答
2

包含file3.h在 file1.c 和 file2.c 中

于 2012-04-27T17:54:24.617 回答
2

由于代码混乱,我建议避免使用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
于 2012-04-27T18:27:34.183 回答
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);
}

文件: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 回答