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可以为全局变量被共享使用。这是我的第二个问题。
如果我的想法有误,请指出。谢谢!
答案 0 :(得分:7)
在头文件将变量声明为static
具有如在每一个文件,该文件包括报头声明为static
的确切相同的效果。每个转换单元(即,.cpp
文件)将结束与自己的该变量的情况下,从在其他的翻译单元的那些分开。这令人难以置信,而且几乎可以肯定不是您想要的。不要这样做。