C、C++ static 的作用

 1、隐藏

 当同时编译多个文件时,所有未加static关键字的全局变量和函数都具有全局可见性。

例如:同时编译两个源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code-pre class="code-pre" id="pre-HW5twS"><code-line class="line-numbers-rows"></code-line>//ghz.c
<code-line class="line-numbers-rows"></code-line>#include <stdio.h>
<code-line class="line-numbers-rows"></code-line>char a = 'g';
<code-line class="line-numbers-rows"></code-line>void GHz(){
<code-line class="line-numbers-rows"></code-line>    printf("I'm GHz\n");
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>//main.c
<code-line class="line-numbers-rows"></code-line>#include <stdio.h>
<code-line class="line-numbers-rows"></code-line>#include <stdlib.h>
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>int main()
<code-line class="line-numbers-rows"></code-line>{
<code-line class="line-numbers-rows"></code-line>    extern char a; //引用已声明变量
<code-line class="line-numbers-rows"></code-line>    printf("%c\n",a);
<code-line class="line-numbers-rows"></code-line>    GHz();
<code-line class="line-numbers-rows"></code-line>    return 0;
<code-line class="line-numbers-rows"></code-line>}</code-pre>

输出:

如果加了static,ghz.c文件就会对其它源文件隐藏。例如在a和GHz的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

2、记忆功能和全局生存期

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。存储在静态数据区的变量有两种,一种是全局变量,另外一种即static修饰的静态变量,只不过静态变量和全局变量比起来静态变量能够控制变量的可见范围(如果static变量声明在函数内部作为局部变量,那么它的生存期为整个源程序,但是它和自动变量的作用域一样,只能在定义该变量的函数内使用)

例:

#include <stdio.h> #include <stdlib.h> int f(int *p) { static int j =0; p[j++] += 1; p[j++] += 1; return 0; } int main() { int a[5] = {1,2,3,4,5}; int i = 0; for(i = 0; i < 2;i++) f(a); for(i = 0; i < 5; i++) printf("%d ",a[i]); return 0; }

输出:

 


__EOF__

本文作者GHzz
本文链接https://www.cnblogs.com/GHzcx/p/8540247.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   GHzz  阅读(422)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示