C++ 全局变量在静态库中的寿命有多长?

C++ 全局变量在静态库中的寿命有多长?,c++,memory-management,global-variables,static-libraries,undefined-behavior,C++,Memory Management,Global Variables,Static Libraries,Undefined Behavior,假设我有以下用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)

假设我有以下用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";
}
因此,显然,全局变量在函数调用中“幸存”,与我在可执行文件中实现foo并多次调用该可执行文件不同,全局变量每次都将设置为零


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

您可以想象全局变量在输入
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;
}

您可以想象全局变量在输入
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;
}

它贯穿于使用它的编译单元的生命周期。是的,允许这样做,但这是一种不好的做法。
extern
不应用于函数定义。它没有效果,可能会让读者感到困惑。@Brian你是对的。。。我想我可以用它来控制哪些函数对于库的用户来说是“可见的”,但显然不是这样。是否有其他关键字用于此功能?您可以声明函数
static
,以使其对翻译单元专用。在匿名名称空间中声明它们具有相同的效果,它贯穿于使用它的编译单元的生命周期。是的,允许这样做,但这是一种不好的做法。
extern
不应用于函数定义。它没有效果,可能会让读者感到困惑。@Brian你是对的。。。我想我可以用它来控制哪些函数对于库的用户来说是“可见的”,但显然不是这样。是否有其他关键字用于此功能?您可以声明函数
static
,以使其对翻译单元专用。在匿名命名空间中声明它们具有相同的效果。