gpt4 book ai didi

c - 如何在多个模块中处理静态全局变量?

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:17 24 4
gpt4 key购买 nike

在 C 语言中,在全局级别(在任何函数之外)声明一个变量 static 表明它仅对该链接器对象(通常是该 .C 文件)可见。

如果同一个 .C 文件是多个不同库的一部分,然后这些库在单个可执行文件中链接在一起,会发生冲突吗?

例如:

我的文件.c

typedef struct {
[my important data];
} MyGlobalType;

static MyGlobalType globalData = { [...data...] };

那么如果我有:

Plugin_Alpha.so:由 MyFile.C + AlphaSource.C 组成
Plugin_Beta.so:由MyFile.C + BetaSource.C组成
MainProgram.exe:由 MainCode.C(加载两个插件)组成

Plugin_Alpha 和 Plugin_Beta 是否会有单独的 globalData 副本?或者他们最终会引用相同的结构吗?

最佳答案

好吧,这是找出答案的一种方法:

文件liba.c:

static int globalData;

int *GetGlobalData() { return &globalData; }

编译成两个独立的共享库:

$ gcc liba.c -o liba.so -fPIC -shared
$ gcc liba.c -o libb.so -fPIC -shared

主程序:

#include <dlfcn.h>
#include <stdio.h>

int main(void)
{
// Error checking omitted for expository purposes

void *liba = dlopen("liba.so", RTLD_LAZY);
void *libb = dlopen("libb.so", RTLD_LAZY);

typedef int* (*FuncV_IP)(void);
FuncV_IP funca = (FuncV_IP)dlsym(liba, "GetGlobalData");
FuncV_IP funcb = (FuncV_IP)dlsym(libb, "GetGlobalData");

printf("Module A: GetGlobalData() ==> %p\n", funca());
printf("Module B: GetGlobalData() ==> %p\n", funcb());

dlclose(liba);
dlclose(libb);

return 0;
}

编译运行:

$ gcc main.c -ldl
$ LD_LIBRARY_PATH=. ./a.out

输出:

Module A: GetGlobalData() ==> 0x7fa97536d020
Module B: GetGlobalData() ==> 0x7fa97516b020

因此,每个共享库都有自己的全局变量副本。

关于c - 如何在多个模块中处理静态全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com