C++ 一个含有静态全局变量的头文件被包含多次

例如我在stdafx.h文件里写一个静态变量s,在程序中通过不同的类的实例获取的s的地址不同,且值也互相不影响,这是怎么回事?如果去掉静态,只要多次包含一个头文件就无法通... 例如我在 stdafx.h 文件里写一个静态变量 s ,在程序中通过不同的类的实例获取的 s 的地址不同,且值也互相不影响,这是怎么回事?
如果去掉静态,只要多次包含一个头文件就无法通过编译,而且写了#pragma once或者用宏标注都无效
如果我需要一个真正全局通用的变量应该如何做?
代码示例:
--------stdafx.h:--------
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <windows.h>
static int s = 0;
-------AA.h----------
#pragma once
class AA
{
public:
AA(void);
~AA(void);
};
---------AA.cpp--------
#include "StdAfx.h"
#include "AA.h"
AA::AA(void)
{
std::cout << "&::sig = " << &::sig << ",::sig = " << ::sig << std::endl;
}
AA::~AA(void){}
----------Main.cpp---------
#include "stdafx.h"
#include "AA.h"

int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "&::sig = " << &::sig << ",::sig = " << ::sig << std::endl;
AA();

}

运行的结果是:
main函数内直接打印的结果与AA构造函数内打印的结果 sig地址不同,值不影响
展开
 我来答
欢乐多Ek
2013-10-28 · TA获得超过478个赞
知道小有建树答主
回答量:477
采纳率:0%
帮助的人:418万
展开全部
在对一个变量声明了static之后这个变量只能在当前文件中起作用了,你在头文件里面声明了,那么第一个包含这个头文件的源文件就是这个static变量的作用域了,第二个包含头文件的源文件就是这个变量的第二个作用域,当然也就不一样了。

至于你需要一个全局变量,你可以声明extern,但是要注意在头文件中只能声明,要在cpp文件中再定义一次。这样包含了这个头文件的源文件都能共享同一个全局变量了。不过c++最好的全局变量是类中static。
White_MouseYBZ
2013-10-28 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6686万
展开全部
从使用角度讲,在同一个文件里,全局变量和静态全局变量的意义是等价的。静态全局变量只在定义它的文件中有效,别的文件中用extern也无效。而一般全局变量在别的文件中经extern即获得正常使用资格。不知道你说的“真正全局通用”是什么要求,不妨按前述二者的差别选择变量类型。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Metaphor90
2013-10-28 · TA获得超过202个赞
知道小有建树答主
回答量:146
采纳率:0%
帮助的人:132万
展开全部
你定义的静态变量是s,sig是什么?
追问
不好意思写错,sig 就是 s
追答

对于.h文件,你可以理解为###.h文件中的全部内容都是copy到 #include <###.h>中的,程序编译的只是.cpp文件,如果你的StdAfx.h被包含了两次,那和你在两个文件里各定义一次static int sig = 0;是一样的。


另:如果把代码改成这样,放到一个文件里,那么每次输出的地址就相同了。


#include <iostream>
using namespace std;

static int sig = 0;

class AA
{
public:
    AA(void);
    ~AA(void);
};

AA::AA(void)
{
    std::cout << "&::sig = " << &::sig << ",::sig = " << ::sig << std::endl;
}
AA::~AA(void){}

int main()
{
    std::cout << "&::sig = " << &::sig << ",::sig = " << ::sig << std::endl;
AA();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式