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地址不同,值不影响 展开
如果去掉静态,只要多次包含一个头文件就无法通过编译,而且写了#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地址不同,值不影响 展开
展开全部
从使用角度讲,在同一个文件里,全局变量和静态全局变量的意义是等价的。静态全局变量只在定义它的文件中有效,别的文件中用extern也无效。而一般全局变量在别的文件中经extern即获得正常使用资格。不知道你说的“真正全局通用”是什么要求,不妨按前述二者的差别选择变量类型。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你定义的静态变量是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();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询