例如我在 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地址不同,值不影响
C++一个含有静态全局变量的头文件被包含多次
答案:3 悬赏:60 手机版
解决时间 2021-01-03 09:38
- 提问者网友:藍了天白赴美
- 2021-01-02 22:32
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-01-06 20:44
在对一个变量声明了static之后这个变量只能在当前文件中起作用了,你在头文件里面声明了,那么第一个包含这个头文件的源文件就是这个static变量的作用域了,第二个包含头文件的源文件就是这个变量的第二个作用域,当然也就不一样了。
至于你需要一个全局变量,你可以声明extern,但是要注意在头文件中只能声明,要在cpp文件中再定义一次。这样包含了这个头文件的源文件都能共享同一个全局变量了。不过c++最好的全局变量是类中static。
至于你需要一个全局变量,你可以声明extern,但是要注意在头文件中只能声明,要在cpp文件中再定义一次。这样包含了这个头文件的源文件都能共享同一个全局变量了。不过c++最好的全局变量是类中static。
全部回答
- 1楼网友:枭雄戏美人
- 2021-01-06 21:49
注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,c++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。不过有三个例外,一下三中实体的定义也可放到头文件中。1.值在编译时就已知的const 变量的定义可以放到头文件中 如:const int num(10);2.类的定义可以放到头文件中3.inline 函数这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同。 参考------c++ primer
- 2楼网友:有你哪都是故乡
- 2021-01-06 21:28
从使用角度讲,在同一个文件里,全局变量和静态全局变量的意义是等价的。静态全局变量只在定义它的文件中有效,别的文件中用extern也无效。而一般全局变量在别的文件中经extern即获得正常使用资格。不知道你说的“真正全局通用”是什么要求,不妨按前述二者的差别选择变量类型。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯