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 可能看起来很明显,但 updateget 在函数内部有 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语言如何在多个源文件之间共享一个变量及其值?的主要内容,如果未能解决你的问题,请参考以下文章

c语言一个结构体如何在多个源文件里面调用?

如何在 C++ 中跨多个源文件共享变量?

C语言中 多个源文件之间函数如何调用问题

C语言可以在不同的源文件中定义相同名字的全局变量吗

C/C++多个源文件访问同一全局变量

vscode C语言如何编译多个源文件?