【问题标题】:How can I access and modify a global variable across multiple files?如何跨多个文件访问和修改全局变量?
【发布时间】:2019-06-26 21:03:48
【问题描述】:

正如标题所说,我想创建一个系统,让两个程序可以访问和修改同一个全局变量。

我创建了一个目录,其中包含文件 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 在sleep() 在1.out 中完成之前运行。结果如下:

./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 时,另一个程序的版本不会被修改。是否可以创建一个可以跨多个文件共享和修改的全局变量?

【问题讨论】:

  • 不,这是不可能的。全局变量是进程的一部分,每个进程都有自己的内存。
  • 那么,您有什么建议来完成这项工作吗?
  • 如果你想在程序完成后永久保存一些东西,把它放在一个文件中。
  • 如果程序同时运行,请使用共享内存或其他形式的进程间通信。

标签: c linker global-variables


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多