c语言如何在多个源文件之间共享一个变量及其值?
Posted
技术标签:
【中文标题】c语言如何在多个源文件之间共享一个变量及其值?【英文标题】:how to share a variable and its value between many source file in c language? 【发布时间】:2012-04-27 17:40:40 【问题描述】:我有 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
中调用更新并更新 myvariable
在file2.c
中看不到更改,因为在 file2.c 中调用 get 并且
打印 myvariable 然后打印 0,仅当在 file2.c 中调用更新时才看到更改。
似乎该变量是共享的,但是对于每个源文件,该变量都有不同的变量值/不同的内存
【问题讨论】:
你是如何编译这些文件来创建可执行文件的? 在 file1.c 和 file2.c 中是否还声明了“int myvariable;”?你不应该。 我用别人给的 makefile 编译它们,不,我没有在任何文件中声明它们,只在我写的 file3.c 和 file3.h 中声明它们。 这段代码有多大?你可以在这里发布整个来源吗?如果它太大,也许你可以使用 pastebin 等。如果没有所有代码,很难调试这个问题。听起来您已经实现了人们的建议,所以可能正在发生某事。您是否尝试过使用调试器单步执行代码> 鉴于每个文件将需要少于 30 行代码,您应该发布完整的、可编译的文件示例(但文件只包含显示问题所必需的内容)。当前发布的内容中缺少一些重要内容。 【参考方案1】:当您需要变量时,您可以在其他文件中将变量声明为extern ...
【讨论】:
可以,但通常最好不要创建很多全局变量。创建具有文件范围(静态)的变量,并根据需要在该文件中提供访问函数。应用程序的其余部分(来自不同的文件和范围)将有然后使用访问功能。通常会带来更简洁的设计,更易于调试和维护。【参考方案2】:在 file1.c 和 file2.c 中包含 file3.h
【讨论】:
我已经这样做了,因为我写了“......称为file3.h(当然,它包含在file1.c file2.c和file3.c中)” sorry 可能看起来很明显,但update
和 get
在函数内部有 int myvariable
吗?如果没有,您可以添加获取和更新代码。
无效更新(无效) myvariable++; int get(void) return myvariable;
也刚刚注意到你在标题中得到了extern myvariable
而不是extern int myvariable
我忘了在这里写,但在我的代码中已经写好了,现在我编辑我的代码【参考方案3】:
我建议避免使用 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
【讨论】:
废话。extern
变量声明正确地属于file3.h
,即使您的方法也必须包含它,这是关于访问控制的。代码混乱不是这里的问题。
我的方法没有暴露extern
变量——只有两个函数用于读取/写入它。有时这也是一种好方法。
0x69 - 它对我不起作用。如果我在 file1.c 中调用此 update(5) 然后在此处打印 - 它将打印 5。但之后当我从 file2.c 调用 get() 并打印它时,将打印 0 而不是我想要的 5。
我的解决方案不可能这样。
或者你有很多地方在你尝试获取它之前将这个变量更新为零......如果你能显示你的完整代码会很好。这里没有魔法。【参考方案4】:
这只是一种可能的解决方案。这样做,变量对整个应用程序不是全局的,只能使用访问函数读取/写入。如果您有任何问题,请告诉我。
文件: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
我希望这会有所帮助。
【讨论】:
以上是关于c语言如何在多个源文件之间共享一个变量及其值?的主要内容,如果未能解决你的问题,请参考以下文章