我有一个非常大的项目(我没有写过)。从我看过的代码中,我无法在项目中找到任何全局状态,但我的同事告诉我项目中有全局状态(这就是为什么我们只能创建一个上下文会话一个过程,而不是在单个过程中创建多个上下文会话)。所以现在我想知道这个全局状态在代码库中的位置。
现在,当然,我可以问他全球状态在哪里。但我想我会来到StackOverflow,看看是否有更好的选择(即不需要我花时间,我的同事没有,以及我可以做的事情(未来的项目,当代码的原始维护者无法向我提问时)。如果程序/库中存在全局状态,我该如何查找/检测它?
(注意:我已经用C和C ++标记了这个,因为这些项目都是基于C和C ++的)
答案 0 :(得分:2)
" Global",就像在全局变量中一样,也许不是它的全部真相。但你可能正在寻找只分配一次的东西(" singleton")。对于变量,在文件范围(外部函数)或静态分配的所有变量都具有此属性。 (它们还具有静态存储持续时间。)因此,如果这是"状态"您正在寻找存储在变量中,去查找在文件范围分配的变量或静态。
当然,程序也可能使用一些外部资源,只分配一次,例如文件,硬件资源或Windows注册密钥等。在这种情况下,它变得更复杂,并且找不到通用的方法。
答案 1 :(得分:1)
+1给Lundin提及可能具有全局状态但在查找全局变量时不显示的系统资源。但由于自动检测到这种情况几乎不可能,因此我专注于做全局变量。这就是我在OS X和Linux上使用的内容:
nm ./file | egrep ' [dD] '
示例:强>
$ cat global.cpp
#include <iostream>
int global_external = 1; // Should show up
static int global_static = 2; // Should show up
namespace
{
int global_anon = 3; // Should show up
}
void foo()
{
static int static_local = 4; // Should show up
int local = 5; // Should NOT show up
std::cout << global_external << std::endl;
std::cout << global_static << std::endl;
std::cout << global_anon << std::endl;
std::cout << static_local << std::endl;
std::cout << local << std::endl;
}
int main()
{
foo();
}
$ c++ global.cpp -o program
$ nm program | egrep ' [dD] '
0000000100001078 d __ZL13global_static
000000010000107c d __ZN12_GLOBAL__N_111global_anonE
0000000100001074 d __ZZ3foovE12static_local
0000000100001070 D _global_external
可以看出,只打印了全局变量。由于名称较少,因此C更加清晰。