【发布时间】: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