繁体   English   中英

共享库中的静态变量

[英]Static variable inside shared library

我的问题是关于在共享库中创建的静态变量(静态void *)(让我们称之为'S'),但它是一个未在外面显示的内部变量,但API的每次调用都依赖于它。 现在让我们考虑一个案例,当一个程序(让我们称之为主程序)链接到另外两个共享库,并且每个库都链接到库S.现在,我们的主程序的静态变量会发生什么? 它有一个实例吗? 二?

Suma的回答是正确的。 只有一个静态变量实例。 这也是为什么在共享库中使用静态全局变量可能是一个巨大的问题。 这可能发生的一个现实世界的例子:

  • Apache webserver,它加载以下模块:
    • 链接的mod_php
      • libxml2的
    • mod_perl加载
      • libxml2的

现在,如果某些PHP代码修改了像libxml2中的解析器选项这样的全局设置,Perl代码也会看到这些更改。 这可能导致非常难以诊断的错误。 因此,您应该不惜一切代价避免共享库中的全局状态。

(使用libxml2,您可以在本地进行大部分设置。)

假设您的静态变量仅在一个转换单元中定义,它将只存在一次,因为共享库只加载一次到进程中。

如果使用共享静态链接的混合,这将变得更加困难。

编译器为每个全局静态变量创建一个不同的实例, 即使您有多个具有相同名称的变量也是如此。

实际上,编译器(或可能是预处理器)根据声明它的源文件的名称隐式地更改每个这样的变量的名称。

您可以通过在头文件中声明全局静态变量来证明这一点,然后将此头文件包含在几个不同的源文件中。 尝试在每个源文件中将其设置为不同的值,您将看到此变量在每个源文件中保留其不同的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM