如何跨多个文件访问和修改全局变量?

时间:2019-06-26 21:03:48

标签: c linker global-variables

就像标题所述,我想创建一个系统,其中两个程序可以访问和修改相同的全局变量。

我创建了一个目录,其中包含文件1.c,2.c,foo.c和foo.h。

1.c:

#include <unistd.h>
#include <stdio.h>
#include "foo.h"

int main(){
    printf("foo is %d\n", foo);
    sleep(7);
    printf("now foo is %d\n", foo);
}

2.c:

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

int main(){
    increment();
    printf("2.c is incrementing foo. foo is now %d\n", foo);
}

foo.h:

#ifndef FOO_H
#define FOO_H

extern int foo;
void increment(void);

#endif

foo.c:

#include <stdlib.h>
#include "foo.h"

int foo = 5;

void increment(){
    ++foo;
}

我使用以下编译命令进行编译:

gcc -c foo.c
gcc 1.c foo.o -o 1.out
gcc 2.c foo.o -o 2.out

然后我用./1.out ./2.out运行它,确保2.out在1.out中的sleep()完成之前运行。结果如下:

./1.out 
foo is 5
now foo is 5
./2.out 
2.c is incrementing foo. foo is now 6

我的理论是,当1.c和2.c与foo.o链接时,它们都获得自己的foo本地副本,因此,当一个程序修改foo时,另一个程序的版本不变。是否可以创建一个可以在多个文件之间共享和修改的全局变量?

1 个答案:

答案 0 :(得分:3)

在C中,全局变量对于执行单元(过程)是全局的,而不对于执行环境(系统)是全局的。标准C没有提供在进程之间共享内存的机制。但是,您的平台(Linux,Windows,MacOS等)可能会这样做。查找“共享内存”。