求助C++静态全局变量的问题

Cooper_xia 2020-01-03 05:25:28
(第一次发帖,规矩不懂还请见谅)
在头文件中声明了一个静态全局变量a,初始化会是0,通过show函数来输出,但发现在不同文件下结果跟预料的不太一样
头文件pch.h:

static int a;
static void show1()
{
std::cout << ++a << std::endl;
}
void show2();
void show3();

pch.cpp:
void show2()
{
show1();
}
void show3()
{
show1();
show1();
show2();
show2();
}

main.cpp
void show4()
{
show1();
}
int main()
{
show1(); //1
show1(); //2
show2(); //1
show2(); //2
show2(); //3
show3(); //4,5,6,7
show4(); //3
show4(); //4
return 0;
}

为什么show2返回的是1而不是3?
show4又按show1时的a值进行计算?
...全文
71 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cooper_xia 2020-01-04
  • 打赏
  • 举报
回复
引用 8 楼 qq_40162781 的回复:
const默认也是如此,所以const对象能在头文件中定义,而普通变量不行
嗯嗯,在书上看到了,const声明的全局变量链接性不同于普通变量,而与static一样都是内部的,所以不会犯普通变量在头文件中定义会出现的重定义问题 谢谢回复~
qq_40162781 2020-01-04
  • 打赏
  • 举报
回复
const默认也是如此,所以const对象能在头文件中定义,而普通变量不行
不闻窗外事 2020-01-03
  • 打赏
  • 举报
回复
引用 6 楼 Cooper_xia的回复:
[quote=引用 5 楼 不闻窗外事 的回复:] 可是如果每个cpp都包含该静态变量和show1,main.cpp的初次调用结果为什么不是从1开始 就是因为我刚才说的,实际上.h文件的内容都拷贝到main.cpp中了,你在main.cpp中调用的show1实际上修改的就是main.cpp中的静态变量,然后你的show2和show3修改的是pch.cpp文件中的静态变量;实际上有两个静态变量,分别位于main.cpp和pch.cpp
噢噢明白了,也就是说show函数执行时,其中的a会优先使用当前函数所在的文件作用域的静态变量,所以在main中调用pch中定义的show2和show3,程序会转到pch文件作用域中执行(这么说对不?),因此调用的a就是pch中的静态变量 谢谢啦~[/quote] 不是优先使用,而是只能使用本文件的静态变量,别人的也用不了
Cooper_xia 2020-01-03
  • 打赏
  • 举报
回复
引用 5 楼 不闻窗外事 的回复:
可是如果每个cpp都包含该静态变量和show1,main.cpp的初次调用结果为什么不是从1开始 就是因为我刚才说的,实际上.h文件的内容都拷贝到main.cpp中了,你在main.cpp中调用的show1实际上修改的就是main.cpp中的静态变量,然后你的show2和show3修改的是pch.cpp文件中的静态变量;实际上有两个静态变量,分别位于main.cpp和pch.cpp
噢噢明白了,也就是说show函数执行时,其中的a会优先使用当前函数所在的文件作用域的静态变量,所以在main中调用pch中定义的show2和show3,程序会转到pch文件作用域中执行(这么说对不?),因此调用的a就是pch中的静态变量 谢谢啦~
不闻窗外事 2020-01-03
  • 打赏
  • 举报
回复
可是如果每个cpp都包含该静态变量和show1,main.cpp的初次调用结果为什么不是从1开始
就是因为我刚才说的,实际上.h文件的内容都拷贝到main.cpp中了,你在main.cpp中调用的show1实际上修改的就是main.cpp中的静态变量,然后你的show2和show3修改的是pch.cpp文件中的静态变量;实际上有两个静态变量,分别位于main.cpp和pch.cpp
不闻窗外事 2020-01-03
  • 打赏
  • 举报
回复
引用 3 楼 Cooper_xia 的回复:
[quote=引用 2 楼 不闻窗外事 的回复:]
[quote=引用 1 楼 不闻窗外事 的回复:]
不知道你是如何设计的文件结构,但是具有static的函数不具有跨文件的作用域,所以你的pcp.cpp根本就不应该去调用show1,这违反了作用域,如果你想使用pcp.cpp调用show1,那么show1不应该是静态的,非静态的函数才具有跨文件的作用域。

第二,头文件中不应该定义静态变量,静态变量的定义应该在.cpp文件中

我猜测是你的.cpp

我猜测是你的.cpp直接包含了.h,那么你的程序中其实就不只有一个静态变量,因为静态变量也不具有跨文件的作用域,所以你的每个包含.h的文件都有一个该静态变量和show1静态函数,所以值才不一样[/quote]
谢谢回复,是的,两个cpp文件都包含了.h
可是如果每个cpp都包含该静态变量和show1,main.cpp的初次调用结果为什么不是从1开始
我将pch.cpp中show2和show3的实现放到main.cpp中,那么原程序的结果就又不同了(结果是1~11),这里a是全局的了,这是是为啥[/quote]
因为你现在的静态变量和静态函数都在main.cpp中了啊,你要知道一点,那就是.h文件的内容在编译的时候会合并到包含它的.cpp文件中,实际上就相当于把.h的内容拷贝到main.cpp中了,所以当然只有一份静态变量和静态函数
Cooper_xia 2020-01-03
  • 打赏
  • 举报
回复
引用 2 楼 不闻窗外事 的回复:
[quote=引用 1 楼 不闻窗外事 的回复:] 不知道你是如何设计的文件结构,但是具有static的函数不具有跨文件的作用域,所以你的pcp.cpp根本就不应该去调用show1,这违反了作用域,如果你想使用pcp.cpp调用show1,那么show1不应该是静态的,非静态的函数才具有跨文件的作用域。 第二,头文件中不应该定义静态变量,静态变量的定义应该在.cpp文件中 我猜测是你的.cpp
我猜测是你的.cpp直接包含了.h,那么你的程序中其实就不只有一个静态变量,因为静态变量也不具有跨文件的作用域,所以你的每个包含.h的文件都有一个该静态变量和show1静态函数,所以值才不一样[/quote] 谢谢回复,是的,两个cpp文件都包含了.h 可是如果每个cpp都包含该静态变量和show1,main.cpp的初次调用结果为什么不是从1开始 我将pch.cpp中show2和show3的实现放到main.cpp中,那么原程序的结果就又不同了(结果是1~11),这里a是全局的了,这是是为啥
不闻窗外事 2020-01-03
  • 打赏
  • 举报
回复
引用 1 楼 不闻窗外事 的回复:
不知道你是如何设计的文件结构,但是具有static的函数不具有跨文件的作用域,所以你的pcp.cpp根本就不应该去调用show1,这违反了作用域,如果你想使用pcp.cpp调用show1,那么show1不应该是静态的,非静态的函数才具有跨文件的作用域。

第二,头文件中不应该定义静态变量,静态变量的定义应该在.cpp文件中

我猜测是你的.cpp

我猜测是你的.cpp直接包含了.h,那么你的程序中其实就不只有一个静态变量,因为静态变量也不具有跨文件的作用域,所以你的每个包含.h的文件都有一个该静态变量和show1静态函数,所以值才不一样
不闻窗外事 2020-01-03
  • 打赏
  • 举报
回复
不知道你是如何设计的文件结构,但是具有static的函数不具有跨文件的作用域,所以你的pcp.cpp根本就不应该去调用show1,这违反了作用域,如果你想使用pcp.cpp调用show1,那么show1不应该是静态的,非静态的函数才具有跨文件的作用域。

第二,头文件中不应该定义静态变量,静态变量的定义应该在.cpp文件中

我猜测是你的.cpp

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧