static关键字在C/C++中的作用(详解)

深入解析C/C++中static关键字:从原理到实战应用 在C/C++编程中,变量的存储周期和链接属性是理解程序内存管理的基础概念。存储周期决定了变量在内存中的生命周期,而链接属性则控制着标识符在不同编译单元中的可见性。static关键字的核心作用正是同时改变这两个属性:它将变量的存储周期从自动存储期变为静态存储期,使其在程序整个运行期间持续存在;同时将全局变量和函数的链接属性从外部链接改为内部链接,限制其作用域至定义的文件内。这一特性在工程实践中具有重要价值,它不仅是实现模块化封装、避免命名冲突的关键手段,还能用于函数状态持久化、实现单例模式等场景。然而,在多线 阅读详情

static关键字在C/C++的作用:

1.将变量声明为静态变量:

静态变量会存储在程序的数据段中,也就是说不会在栈中分配,它的生命周期是全局的。
如果是局部静态变量,它的生命周期也是全局的并且只被初始化一次,但是作用域就仅仅是在定义的函数体中。
例子:

#include <stdio.h>

int count = 100;
void func()
{
    static int count = 10;
    printf("%d\n", count--);
}
int main()
{
    int i = 0;
    for(; i < 10; i++)
    {
        func();
    }
    printf("%d\n", count);
    return 0;
}

输出结果:
10
9
8
7
6
5
4
3
2
1
100

这里再提一点,由于声明了static,变量是被存储在数据区中,都会被默认初始化成0。
2.C++中的static:
1).类的静态成员函数是属于整个类的而非某个对象,并且它没有this指针。由此引申出,它不能访问非静态数据和非静态成员函数,以及不能被声明为virtual、const、volatile。这几点需要对C++的内存模型有一定的理解才能明白。
2).类的静态数据成员同样是属于类的,对象都可以进行访问。初始化需要在类外进行。初始化格式:<数据类型><类名>::<静态数据成员名>=<值>。
3).对一个静态成员函数取地址,获得的是内存中的位置并且类型是一个非成员函数指针。
例子:

#include <iostream>
using namespace std;

class Test
{
    public:
        Test(int _x, int _y):x(_x), y(_y){};
        ~Test(){};
        static void static_func();
        void show();
    private:
        int x, y;
        static int z;
};

void Test::static_func()
{
    cout << "I'm static function " << endl;
    /* show(); 这里如果调用show()会报错
    因为其实一个普通的成员函数传参数时都会传入this指针,调用其它成员函数时就变成了this->func()。由于静态成员函数没有this指针,这一功能当然就无法实现了,也不能访问静态成员变量同理。
    不能声明为virtual也是因为调用虚函数传参时传入了this指针。
    不能声明为const也是因为没有this指针,在C++中const用于表示函数不能修改成员变量的值,静态成员函数连this指针都没有,当然不能实现了。
    */
}

void Test::show()
{
    cout << x << y << z << endl;
}
//从这里可以看出,类中声明的访问控制并不妨碍静态成员变量的初始化。但是在访问时是会受限的。
int Test::z = 3;

int main()
{
    Test t(1, 2);
    t.show();
    Test::static_func();//静态成员函数的调用是直接由类调用
    //cout << Test::z; 会报错,因为z是private的。
    return 0;
}

3.这一点其实是static最重要的一点。即它可以隐藏变量和函数。
在一个源文件中把函数/变量声明为了static之后,其它源文件是访问不到的。
a.c:

int num = 3;
void test()
{
    printf("I'm a's function\n");
}

b.c:

#include <stdio.h>
extern int num;
int main()
{
    printf("%d\n", num);
    test();
}

然后编译一下gcc a.c b.c -o test。
运行结果:

3
I's a's function

但是当我们给test函数和变量num加上static关键字,发现编译过不了了,提示对test和num未定义的引用。
利用这一特点,我们可以在不同的文件中定义相同名字的变量和函数而不必担心命名冲突。这在多个模块开发时是很有用处的。

Windows 11 系统部署 OpenClaw 完整指南:从零到一的 AI 助手搭建 OpenClaw(昵称“小龙虾”)是一款开源 AI 代理工具,定位为“AI 指挥官”,能够接收指令、调用工具并自动化处理任务。它支持对接国内外多款大模型,所有数据本地存储,兼顾实用性与安全性。本文将详细介绍在 Windows 11 系统上部署 OpenClaw 的完整流程。OpenClaw 在 Windows 11 上的部署虽然有一定技术门槛,但按照本文的步骤操作,大多数用户都能顺利完成安装。环境准备是基础:确保 Node.js ≥22 版本,使用管理员权限操作安装方式灵活选择。 阅读详情

相关推荐

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

static关键字的作用

函数也是具有外部连接属性的,编译器每次编译只处理一个编译单元,当某个编译单元需要使用其他编译单元中的函数,只需要声明该函数(或者包含该函数声明所在的头文件)然后就可以使用,当一个函数被static所修饰的时候,这个函数的外部连接属性就变成了内部连接属性,也就成为了静态函数,使得这个静态函数只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。

weixin_44049823的博客 1万+

EVE-NG 新增 qcow2 镜像教程

本文介绍了如何在 EVE-NG 网络仿真平台中添加 QCOW2 镜像并配置 YML 文件。首先,用户需要了解 EVE-NG 的目录结构,上传并重命名 QCOW2 镜像,然后设置文件权限并刷新界面以识别设备。接着,讲解了 YML 文件的作用,它用于定义设备的CPU、内存、网卡等参数,并给出了配置示例。若有多个设备版本,可以通过复制并重命名 YML 文件使其独立显示。最后,通过检查 QEMU 进程和日志验证 YML 配置是否生效。总结部分强调了 EVE-NG 的自动识别机制以及独立管理设备版本的方式。

qq_41862216的博客 3075

c++ static的作用

c++ static的作用

zhenghe12365的博客 4946

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

如何用Bertalign快速搞定多语言句对齐?5分钟上手教程(附避坑指南)

本文详细介绍了如何利用Bertalign工具快速实现多语言句对齐,从安装配置到实战应用的全流程指南。通过LaBSE句向量技术,Bertalign显著提升了对齐准确率,支持25种语言的任意组合,特别适合处理复杂句式。文章还提供了常见问题的解决方案和性能优化技巧,帮助用户高效完成多语言文本对齐任务。

weixin_42538752的博客 348

c++中static的作用

c++static关键字的作用 以下是一般人都会背了的吧: c/c++共有 1):修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。 2):修饰局部变量时,表明该变量的值不会因为函数终止而丢失。 3):修饰函数时,表明该函数只在同一...

ypshowm的博客 6万+

从入门到精通!Arduino 全栈开发深度指南

本文围绕 Arduino 开发撰写全攻略,从基础入门到高级应用层层递进。开篇介绍 Arduino 概念、优势及硬件家族,引导读者完成开发环境搭建与首个 LED 闪烁项目;深入讲解编程语法、I/O 控制及通信协议;详细阐述传感器、模块应用与调试优化技巧;最后以自定义库开发、低功耗设计等高级内容收尾,并给出综合项目案例与产品化思路。无论新手入门,还是开发者进阶,均可从中系统学习 Arduino 知识,掌握从理论到实践的全流程开发技能。

邓邓子的博客 2754

static关键字有什么作用

目录 static关键字有什么作用 (1) static 成员变量 (2)static成员方法 (3) static 代码块 (4)static内部类 引申: 1.什么是实例变量?什么是局部变量?什么是类变量?什么是 final 变量? 2.static 与 final 结合使用表示什么意思? static关键字有什么作用 static 关键字主要有两种作用:第一,为某特定数据类型或对象分配单一的存储空间,而 与创建对象的个数无关。第二,实现某个方法或属性与类...

m0_65562481的博客 1万+

CLRNet车道线检测模型在Orin Nano Super开发板上的全栈部署与优化实践

本文详细介绍了将CLRNet车道线检测模型部署到NVIDIA Orin Nano Super开发板的全过程。内容包括:1) Orin开发板硬件规格分析;2) JetPack SDK环境配置与Python虚拟环境搭建;3) CLRNet模型架构解析与PyTorch实现;4) 模型转换与TensorRT加速优化方法。通过系统性的环境配置、模型转换和性能优化,为边缘计算场景下的车道线检测应用提供了完整的解决方案,实现了在Orin平台上的高效部署。

huanghm88的专栏 226

ADES1831和ADBMS6830

1、上电默认进入STANDBY模式,SPI发送0xFF也可以进入STANDBY模式2、看门狗定时器超时后,进入SLEEP状态3、配置寄存器中的REFON位使用WRCFGA命令将组A设置为1进入REFUP状态,此状态比待机状态更快地启动ADC转换。i<TOTAL_IC;i++)注意:读AFE数据时会随着AFE片数增加而增加,原因是唤醒时间和AFE片数密切相关,如果需要缩短时间,那么减少唤醒频次。

m0_61973119的博客 264

Vitis HLS 学习笔记--C/C++ static 关键字的作用

在Vitis HLS中,偶尔会用到 static 关键字。考虑到Vitis HLS同时兼容C和C++语言,有必要理解这两种语言中static关键字细微差异。本文旨在梳理和总结C与C++中static关键字的具体差别,以便于开发者更加精确地应用于Vitis HLS环境中。

hi94的博客 1837

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

static关键字用法

static关键字用法1 static关键字2 为什么要引入static3 C/C++中static的作用4 C++中static的用法4.1 面向过程设计中的static4.1.1 静态全局变量4.1.2 静态局部变量4.1.3 静态函数4.2 面向对象程序设计中的`static`(类中的`static`关键字)4.2.1 静态数据成员4.2.2 静态成员函数 1 static关键字 2 为什么要引入static 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上

YYY_77的博客 932

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C/C++中的“static”

static修饰全局变量、函数和局部变量时的相关含义

xvrixingkong的博客 629

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

在 C/C++中 static 关键字详解

static 关键字详解 C/C++ 中的 static 1. 静态局部变量 2. 静态全局变量 全局变量 与extren 3. static 修饰函数 C++的 static 成员 静态成员变量 静态成员函数 总结: const修饰的静态变量

知识分享与学习笔记总结,欢迎指点 2万+

C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

本文将会循序渐进,先从C语言的static讲起,慢慢延申到C++,从易到难,每一步都会举一些通俗易懂的例子帮助大家理解(帮助自己理解,怕忘记😂),好了开始整活!

weixin_45031801的博客 18万+

c/c++ static关键字详解

static关键字

小匠码农 2077

C/C++中static的关键字的理解总结(对比在C和C++中的区别和相同)

前言 static关键字非常好用,特别是早期时候,对于C语言来说,就是靠static关键字完成封装性滴;常见的大型项目中,static用得非常多,并且static关键字也是面试时候的热门关键字之一。在C++中static关键字由于多了类,所以会在C语言的基础上扩展了一些关于类中成员用static关键字修饰的所以掌握非常重要。 一. C语言中的static关键字 0) static关键字的名字理解 static关键字,有人说他命名得不好?因为static翻译为中文是有安静的意思。但是,对于static关键字

呋喃吖的博客 3110

C/C++中static关键字用法总结

在使用关键字static的时候,我们需要注意一下几个原则:被static修饰的变量的存储位置都在静态区,且生命周期延长至整个程序运行结束。static具有隔离作用,被static修饰的全局变量和全局函数的作用域由全局变为当前文件。静态变量虽然具有全局变量的生命周期,但只能作用于自己的作用域。普通静态成员需要在类的外面进行初始化。静态成员函数不能调用类的非静态成员,包括非静态成员和非静态成员函数。

红军不怕远征难,万水千山只等闲 1496

C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。 //a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } ...

Wang Bei的博客 6257

详解C/C++中的static和extern

详解C/C++中的static和extern 从一个小例子开始 开发过程中希望在多个cpp文件中都使用某个全局变量,那这个全局变量该怎么定义、怎么使用呢? 这部分会先给一个小例子,展示编译和运行效果,并不会深入解释背后的原因,关于底层原理的解释会放到后续的部分! 头文件中定义全局变量 异想天开的认为,在头文件中定义全局变量,然后在各个cpp文件include该头文件,这样不就每个cpp中都能访问该全局变量了吗? Head.hpp #ifndef HEAD_H #define HEAD_H

yantuguiguziPGJ的博客 2875

C\C++static关键字的用法总结

static关键字的作用主要起隐藏作用 static关键字在C\C++中都可以修饰内置类型变量、函数 static修饰内置类型变量为静态变量: static修饰的内置类型变量分为静态全局变量和静态局部变量,静态变量内存分配在 .data段,生成的符号为local类型的符号,在链接阶段进行符号解析时不做处理。静态变量只初始化一次,未初始化的静态变量会默认初始化为0。静态全局变量只在本文件可见,...

magic_world_wow的博客 1万+

简述static关键字在c/c++中的作用

在C语言中,关键字static有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。注意,只有在定义了变量后才能使用。如果变量定义在使用之后,要用extern 声明。所以,一般全局变量都会在文件的

1024350154--lj博客 1万+

static在C/C++中的作用详解

本文详细介绍了static在C/C++中的作用以及使用方法,本文分两部分: 第一部分介绍extern在c语言中的作用; 第二部分介绍extern在c++中的作用; Source.cpp文件内代码 /*Source.cpp file*/ #include "Header.h" static int a = 1; int b = 1; //声明,也是定义 static int add1(int a...

qq_35118533的博客 588

通解C/C++静态关键字static在变量、函数中的作用,傻傻分不清楚!

静态修饰关键字,主要分两个方面**修饰变量和修饰函数**,用static修饰的变量称为静态变量,函数称可称为静态函数。那前面说变量又可以分为全局和局部变量,则再次细分一下就可以分为静态全局变量和静态局部变量,先不用乱,其实全局与局部的性质不变只是在加上静态的理解就可以啦。...

weixin_42491720的博客 1569
上一篇: 宏函数为什么使用do{...}while{0}包起来
下一篇: inline关键字和宏函数的异同
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值