永发信息网

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

答案:3  悬赏:60  手机版
解决时间 2021-01-03 09:38
例如我在 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地址不同,值不影响
最佳答案
在对一个变量声明了static之后这个变量只能在当前文件中起作用了,你在头文件里面声明了,那么第一个包含这个头文件的源文件就是这个static变量的作用域了,第二个包含头文件的源文件就是这个变量的第二个作用域,当然也就不一样了。

至于你需要一个全局变量,你可以声明extern,但是要注意在头文件中只能声明,要在cpp文件中再定义一次。这样包含了这个头文件的源文件都能共享同一个全局变量了。不过c++最好的全局变量是类中static。
全部回答
注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,c++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。不过有三个例外,一下三中实体的定义也可放到头文件中。1.值在编译时就已知的const 变量的定义可以放到头文件中 如:const int num(10);2.类的定义可以放到头文件中3.inline 函数这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同。 参考------c++ primer
从使用角度讲,在同一个文件里,全局变量和静态全局变量的意义是等价的。静态全局变量只在定义它的文件中有效,别的文件中用extern也无效。而一般全局变量在别的文件中经extern即获得正常使用资格。不知道你说的“真正全局通用”是什么要求,不妨按前述二者的差别选择变量类型。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
配电箱有型号吗?各型号之间有什么区别?
单选题台北冬季降雨大多属于A.地形雨B.台风雨
单选题YesterdayI________totakemyhome
神武人物洗点丹多少金币一个 20分
下列四组词语中都有错别字,其中只有一个错别
单选题下列人类活动中,哪一项不是利用了动物
学物理好吗?为什么?
加权个案是什么意思
东方沸点培训教育机构真的有传说中那么好吗?
已知方程x2-kx+9=0有两个相等的实数根,则k等
我的手机为什么在江西就可以打电话,到了杭州
(1)这样的12辆车一次可运多少吨货物?(2)
寒碜的反义词
(1)下列叙述是对部分化学知识的归纳,其中
打狗棍全集主题曲剧情介绍片尾曲插曲谢谢了,
推荐资讯
矩形,菱形,正方形,等腰梯形,直角梯形中,
以《上下五千年》读后感 为题写一篇作文
怎么去给父母撒谎
梦见溺水被救,救我的人死了。是什么意思??
工商银行哪个部门最好
下列名人中:①鲁迅;②姚明;③刘徽;④杨利
请问,我的宝宝10个月了,有1、2个月了,经常
白羊座项链
单选题All possible means ______
如图,已知A?(-4,n),B?(2,-4)是一次函
2012年7月19日银行间外汇市场人民币汇率中间
宁夏现在买一手房房子房主需要交纳多少种税务
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?