如何在c语言的多个源文件之间共享一个变量及其值?

如何在c语言的多个源文件之间共享一个变量及其值?,c,global-variables,C,Global Variables,我有两个名为file1.c和file2.c的源文件(.c),它们之间需要共享一个变量, 因此,如果在一个源文件中变量被更新,那么在访问该变量时,在另一个源文件中会看到更改 我所做的是创建另一个名为file3.c的源文件和名为file3.h的头文件(当然,它包含在file1.c file2.c和file3.c中) 但是问题是当调用file1.cupdate并更新myvariable时 在file2.c中看不到更改,因为在file2.c中调用get时 myvariable被打印,然后0被打印,只有在

我有两个名为file1.c和file2.c的源文件(.c),它们之间需要共享一个变量, 因此,如果在一个源文件中变量被更新,那么在访问该变量时,在另一个源文件中会看到更改

我所做的是创建另一个名为file3.c的源文件和名为file3.h的头文件(当然,它包含在file1.c file2.c和file3.c中)

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

您可以在需要变量时在其他文件中声明该变量…

在file1.c和file2.c中包含
file3.h
我建议避免使用
外部变量,因为代码混乱-使用该全局代码在每个文件中重复外部代码。通常最好将全局变量绑定到某个文件范围,使其
为静态的
。然后使用
接口
功能访问它。在您的示例中,它将是:

// 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

这里只有一个可能的解决方案。执行此操作时,变量对整个应用程序不是全局的,只能使用访问函数读取/写入。如果你有问题,请告诉我

文件:
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);
}
文件: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 );
}
下面是运行输出:

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

我希望这会有所帮助。

您是如何编译这些文件来创建可执行文件的?在file1.c和file2.c中,您是否也声明了“int myvariable;”?你不应该这样做。我用一个makefile编译它们,这是别人给我的,不,我没有在任何文件中声明它们,只在我写的file3.c和file3.h中声明。这段代码有多大?你能把全部资料都贴在这里吗?如果它太大,也许您可以使用pastebin等。如果没有所有的代码,调试这个问题是非常困难的。听起来你已经实现了人们的建议,所以可能发生了其他事情。您是否尝试过使用调试器单步执行代码>如果每个文件需要不到30行代码,您应该发布完整的、可编译的文件示例(但只需让文件包含显示问题所需的内容)。这里面少了一些重要的东西。胡说。
extern
变量声明正确地属于
file3.h
,它甚至必须包含在您的方法中,这是关于访问控制的。代码混乱不是这里的问题。我的方法不公开extern变量-只有两个用于读取/写入变量的函数。有时这也是一个很好的方法。0x69-它不适合我。如果我在file1.c中调用这个更新(5),然后在那里打印,它将打印5。但在那之后,当我从file2.c调用get()并打印它时,就会打印出0,而不是我想要的5。我的解决方案不可能是这样。或者在尝试获取变量之前,可能有很多地方会将该变量更新为零。。。如果您能显示完整的代码就好了。这里没有什么神奇之处。我已经在写“…调用file3.h(当然,它包含在file1.c file2.c和file3.c中)”的时候这么做了。“对不起,可能看起来很明显,但是
update
get
是否在函数中包含
int-myvariable
?如果没有,您可以添加get和update代码。void update(void){myvariable++;}int get(void){return myvariable;}还注意到您在header中得到了
extern myvariable
而不是
extern int myvariable
我忘了在这里写它,但在我的代码中写了它,现在我编辑了可以完成的代码yes,但通常最好不要创建太多全局变量。创建具有文件作用域(静态)的变量,并根据需要在该文件中提供访问函数。应用程序的其余部分(来自不同的文件和范围)将必须使用访问功能。通常会导致更干净的设计,更易于调试和维护。
#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 );
[root@jrn SO]# ./test
1
getValue:: 1
after getValue:: 2
getValue:: 3
after getValue:: 4
4