如何在 C 语言的许多源文件之间共享变量及其值



>我有 2 个源文件 (.c) 名为 file1.c 和 file2.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.c 调用更新并更新 myvariable 时在file2.c中看不到更改,因为在 file2.c 中调用 get 时,并且打印 myvariable,然后打印 0,只有在 file2.c 更新中调用时,才会看到更改。似乎该变量是共享的,但对于每个源文件,该变量都有不同的变量值/不同的内存

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

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

我建议避免extern变量,因为代码混乱 - 使用该全局在每个文件中重复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

这只是一种可能的解决方案。这样做,变量不是整个应用程序的全局变量,只能使用访问函数读取/写入。如果您有任何疑问,请告诉我。

文件: access.c access.h file2.c main.c
编译方式:gcc main.c file2.c access.c -o test
运行: ./test

文件: 主.c

#include <stdio.h>
#include "access.h"
int main( int argc, char *argv[] )
{
    int value;

    put( 1 );
    printf("%dn", get());
    put( getValue() + 1 );
    printf("%dn", getValue());
    return(0);
}

文件: 访问.c

#include "access.h"
static int variable = 0;

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

文件: 文件2.c

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

int getValue( void )
{
    int i = get();
    printf("getValue:: %dn", i);
    put(++i);
    printf("after getValue:: %dn", get());
    return( i );
}

文件: 访问.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

我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新