我的问题是关于在共享库中创建的静态变量(static void *)(让我们调用这个库'S'),但它是一个未在外面显示的内部变量,但每次调用API都依赖于它。现在让我们考虑一个案例,当一个程序(让我们称之为主程序)链接到另外两个共享库,并且每个库都链接到库S.现在,我们的主程序的静态变量会发生什么?它有一个实例吗?两个?
答案 0 :(得分:6)
Suma的回答是正确的。只有一个静态变量实例。这也是为什么在共享库中使用静态全局变量可能是一个巨大的问题。这可能发生的一个现实世界的例子:
现在,如果某些PHP代码修改了 libxml2 中的解析器选项等全局设置,Perl代码也会看到这些更改。这可能导致非常难以诊断的错误。因此,您应该不惜一切代价避免共享库中的全局状态。
(使用 libxml2 ,您可以在当地进行大部分设置。)
答案 1 :(得分:3)
答案 2 :(得分:0)
当你有几个具有相同名称的变量时,编译器会为每个全局静态变量甚至创建一个不同的实例。
实际上,编译器(或可能是预处理器)根据声明它的源文件的名称隐式更改每个这样的变量的名称。
您可以通过在头文件中声明全局静态变量来证明这一点,然后将此头文件包含在几个不同的源文件中。尝试在每个源文件中将其设置为不同的值,您将看到此变量在每个源文件中保留其不同的值。