如果在.h文件中将变量定义为“静态”怎么办?

时间:2019-02-02 07:09:36

标签: c++

windows 8,clang

hh.h文件:

#ifndef _H_
#define _H_
#include<string>
using std::string;
static string m; // If m is defined as static, the promble of multiple definitions will be solved.
#endif

foo.cpp

#include "hh.h"
int foo()
{
    m = "456";
}

bar.cpp

#include "hh.h"
int main()
{
m = "123";
}

使用-c编译foo.cpp和bar.cpp

然后,我使用“ nm”检查导出符号表

00000000 b .bss
00000000 d .ctors
00000000 d .data
00000000 d .eh_frame
00000000 r .rdata
00000000 t .text
00000000 b m  // a local var, as 'b'
// others

否则,如果我定义的“ string m”没有限定符静态,例如

hh.h文件:

#ifndef _H_
#define _H_
#include<string>
using std::string;
string m;
#endif

和,我使用“纳米”,检查出口符号表,

00000000 b .bss
00000000 d .ctors
00000000 d .data
00000000 d .eh_frame
00000000 r .rdata
00000000 t .text
00000000 B m  // a global var, as 'B'
// others

链接器告诉变量m为“多个定义”。

我的想法是,在hh.h文件中,我为hh.h编写了一个防御性声明以防止其被多次包含(我使用-E选项检查预编译文件)。然后,如果hh.h不会在最终目标文件中包含两次以上的内容,为什么链接器可以多次访问头文件中声明的全局变量(如m)?这是我的第一个问题。

在另一方面,如果我声明米作为staic,这意味着米将仅由那些谁包括头文件,其中m被declared.But希望变量m可以为全局变量被共享使用。这是我的第二个问题。

如果我的想法有误,请指出。谢谢!

1 个答案:

答案 0 :(得分:7)

在头文件将变量声明为static具有如在每一个文件,该文件包括报头声明为static的确切相同的效果。每个转换单元(即,.cpp文件)将结束与自己的该变量的情况下,从在其他的翻译单元的那些分开。这令人难以置信,而且几乎可以肯定不是您想要的。不要这样做。