我提出这个问题是因为我觉得我不理解C/C++库的一些基本概念.
假设我们有一个库,它保存了一些名为lib_c的状态(例如静态全局变量).假设有另一个库lib_b使用lib_c.
现在,我正在编写一个程序A,它需要lib_b和lib_c.A使用的lib_c与lib_b使用的lib_c有什么不同的方式(即获得静态全局变量的单独副本)?
为了更好地说明我的沮丧,请参见下面的代码示例.
这里是"状态库",它只有两个静态全局值:
C.h:
#ifndef C_H
#define C_H
void init_variables(int a, int b);
int get_a();
int get_b();
#endif
C.C.:(用谷歌翻译翻译)
#include "c.h"
static int a_ = 0, b_ = 0;
void init_variables(int a, int b) {
a_ = a;
b_ = b;
}
int get_a() { return a_; }
int get_b() { return b_; }
下面是使用状态库的另一个库:
B.h.
#ifndef B_H
#define B_H
void read_b();
#endif
b. c:
#include <stdio.h>
#include "b.h"
#include "c.h"
void read_b() {
printf("As seen from b. c: %d, %d\n", get_a(), get_b());
}
下面是我的代码,它使用了两个库:
答:
#include <stdio.h>
#include "b.h"
#include "c.h"
void read_a() {
printf("As seen from 答: %d, %d\n", get_a(), get_b());
}
int main() {
init_variables(1, 2);
read_a();
read_b();
return 0;
}
read_a()和read_b()读取静态全局值1和2的相同内容!似乎lib_b和我的代码没有得到这些静态全局值的不同副本.
我试过使用普通gcc命令编译和使用CMake构建.看看我写的CMakeLists:
cmake_minimum_required(VERSION 3.22)
project(UnderstandStatefulLibs VERSION 1.0 LANGUAGES C)
# c.c -> lib_c
add_library(lib_c c.c)
# b.c + lib_c -> lib_b
add_library(lib_b b.c)
target_link_libraries(lib_b PRIVATE lib_c)
# a.c + lib_b + lib_c -> executable
add_executable(main a.c)
target_link_libraries(main PRIVATE lib_b lib_c)
欢迎对这一问题作出任何澄清.我想知道是否有可能获得静态全局值的单独副本,如果有,如何获得.
谢谢你!