【问题标题】:How long live global variables in a static library?静态库中的全局变量能活多久?
【发布时间】:2019-12-05 04:04:53
【问题描述】:

假设我有以下静态库,用 C++ 实现:

int global = 0;

extern int foo(int i)
{
    global += i;
    return global;
}

我在我的项目中使用它如下:

#include <iostream>

extern int foo(int i);

int main()
{
    std::cout << foo(1) << "\n";
    std::cout << foo(1) << "\n";
    std::cout << foo(1) << "\n";
}

这段代码打印出来:

1
2
3

因此,显然,全局变量在函数调用中“存活”,与我在可执行文件中实现 foo 并多次调用该可执行文件不同,全局变量每次都将设置为零。

问题:全局变量在上面使用的静态库中可以存在多长时间?只要调用可执行文件的main函数?甚至允许这样做吗?

【问题讨论】:

  • 它存在于使用它的编译单元的生命周期中。是的,允许这样做,但这是不好的做法。
  • extern 不应用于函数定义。它没有任何效果,可能会使读者感到困惑。
  • @Brian 你是对的......我认为我可以使用它来控制哪些函数对库的用户变得“可见”,但显然情况并非如此。此类功能是否使用了不同的关键字?
  • 您可以声明函数static 以使其对翻译单元私有。在匿名命名空间中声明它们具有相同的效果。

标签: c++ memory-management global-variables static-libraries undefined-behavior


【解决方案1】:

你可以想象全局变量在main()进入之前被初始化,在main()退出之后被销毁。

实际的规则要复杂一些,但在大多数像这样的简单情况下都会涵盖你。


在这种情况下,您所说的全局变量实际上是具有“全局范围”的“静态存储持续时间对象”。

还有其他静态存储持续时间对象的示例。

extern int foo(int i)
{
    static int global = 0;   // marking this static inside a function
                             // makes it a static storage duration
                             // object that lives longer than the function.

    global += i;
    return global;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-07
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 2012-12-30
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多